【问题标题】:R DBI Parametrized Query: The server supports a maximum of 2100 parametersR DBI参数化查询:服务器最多支持2100个参数
【发布时间】:2022-08-04 22:03:56
【问题描述】:

我正在寻找这个问题的 R 解决方案。我的参数列表超过 18000 个,因此我尝试将其拆分为一个 for 循环,以便在每次迭代期间使用 2000 个参数运行查询(最后一次迭代除外,它可能少于 2000 个)。然而,它似乎是在每次迭代期间“存储”参数的某个地方,所以在第一次迭代之后它告诉我我达到了极限。如果我将它分成 1000 个块,它会在第二次迭代后分解。我的代码如下所示:

Start_List<-(some list of values)

for (i in 1:ceiling(length(List)/2000)) {

  #Partition List into chunks of length 2000
  List<-Start_List[2000*(i-1)+1:min(2000*i,length(Start_List))]
  
  #Create qmarks for List
  qmarks_List <- paste(rep(\"?\",  length(List)), collapse = \",\")
  
  #Query 
  
  
  query <- paste(\"
                SELECT columns
                FROM table
                WHERE column IN (\", qmarks_List, \")

    \")
  
   loop_df <- dbGetQuery(db, query, params= c(as.list(List)))
  
#Store the query in a list
  query_list[[i]]<-loop_df
}

如何清除参数,使其每次迭代都从 0 参数开始?

更新:2022 年 8 月 24 日仍在寻找解决此问题的方法。

  • 我的解释:对于每个查询,params 的参数长度为 1000,当你这样做两次时,你会得到大约 2100 个参数的错误。有了这个,我已经重现了这种情况并且没有发现错误。我在 Windows 11 上使用 R-4.1.3、DBI-1.1.2、odbc-1.3.3,连接到 SQL Server 2016(内部版本 14393)。对我来说,您对qmarks_List 长度的假设可能并不总是正确的,无论是由于Start_List 的长度还是其他原因;这对我来说似乎是一个微不足道的论点,但我没有别的要说:-)

标签: sql r sql-server dbi


【解决方案1】:

虽然我无法重现此错误,但我可以提出替代方案:将您的值上传到临时表,对其进行查询(设置成员资格或左联接),然后将其删除。首先使用绑定参数的原因是为了防止 SQL 注入(恶意或意外损坏),我相信这个建议保留了这种意图。

DBI::dbWriteTable(con, "#sometable", data.frame(val = Start_List), create = TRUE)

## choose one from:
DBI::dbGetQuery(con, "select Columns from table where column in (select val from #sometable)")
DBI::dbGetQuery(con, "select t2.Columns from #sometable t1 left join table t2 on t1.val=t2.column")

## cleanup, though the temp table will auto-delete when you disconnect
DBI::dbExecute(con, "drop table #sometable")

虽然这应该可以解决您遇到的问题,但它还应该简化和加速您的流程:它不是迭代 18K 长列表的组,而是执行单个查询、单个数据拉取,以检索所有记录。如果您之后仍然需要将它们分组,则可以在 R 中轻松完成(可能比在 SQL 中更容易,但我相信 SQL 专家也可以为此演示安全/快速/高效的 SQL 方法)。

如果您不知道 SQL Server 中的临时表:在前面加上 # 使其成为每个连接的临时表,这意味着没有其他连接的用户(即使是相同的用户,不同的连接)会看到这个表;以## 开头使其成为“全局”临时表,这意味着任何连接上的同一用户都将看到该表。当此连接关闭时,这两种类型都会自动删除。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 2021-04-22
    • 2021-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多