在 RODBC 中执行以分号分隔的多条语句

crf*_*crf 5 sql r rodbc

我有一个相当复杂的 SQL 查询,我试图通过 RODBC 运行该查询,其中涉及定义变量。简化版本如下所示:

DECLARE @VARX CHAR = 'X';
SELECT * FROM TABLE WHERE TYPE = @VARX;
Run Code Online (Sandbox Code Playgroud)

运行这段代码效果很好。这失败了:

library(RODBC)
q <- "DECLARE @VARX CHAR = 'X';\nSELECT * FROM TABLE WHERE TYPE = @VARX;"
sqlQuery(ch, q)
# returns character(0)
Run Code Online (Sandbox Code Playgroud)

我通过实验发现,分号之前的第一条语句被执行了,但其余的则没有执行。没有错误——只是分号后面的所有内容似乎都被忽略了。有没有办法执行完整的查询?

顺便说一句,我正在使用 SQL Server。

注意:我之前问过这个问题,它被标记为这个问题的重复,但他们问的是完全不同的事情。在这个问题中,我想执行一个包含多个语句的脚本,而在另一个问题中,作者只想执行一个语句。

Abh*_*bhi 1

你可以试试这个:

library(RODBC)
library(stringr)

filename = "filename.sql"   ### file where the sql code is stored
queries <- readLines(filename) ### read the sql file into R

queries1 = str_replace_all(queries,'--.*$'," ")  ### remove any commented lines
queries2 = paste(queries1, collapse = '\n') ### collapse with new lines
queries3 = unlist(str_split(queries2,"(?<=;)")) ### separate individual queries
Run Code Online (Sandbox Code Playgroud)

此时设置 odbc 连接并运行下面的 for 循环。您还可以在运行 for 循环之前修改查询以添加/更改查询中的变量

for (i in 1:length(queries3)) {
  print(i)
  sqlQuery(conn, queries3[i])
}
Run Code Online (Sandbox Code Playgroud)

for 循环完成后,您可以使用 sqlQuery() 将会话中生成的任何易失性表或常规表拉入 R 中。我还没有对此进行广泛的测试,并且在某些情况下它可能会失败,但它对我正在做的事情有效