在RODBC中执行由分号分隔的多个语句

时间:2017-08-15 13:53:51

标签: sql r rodbc

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

DECLARE @VARX CHAR = 'X';
SELECT * FROM TABLE WHERE TYPE = @VARX;

运行此代码可以正常运行。这失败了:

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

我通过实验发现分号前的第一个语句已执行,但其余的则没有。没有错误 - 看起来分号后的所有内容都被忽略了。有没有办法执行完整查询?

我顺便使用SQL服务器。

注意:之前我问过这个问题并且它被标记为this question的副本,但他们要求完全不同的东西。在这个问题中,我想执行一个包含多个语句的脚本,而在另一个中,作者只是尝试执行一个语句。

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

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

此时设置odbc连接并运行下面的for循环。您还可以在运行for循环

之前修改查询以在查询中添加/更改变量
for (i in 1:length(queries3)) {
  print(i)
  sqlQuery(conn, queries3[i])
}
在for循环完成后,您可以使用sqlQuery()将会话中生成的任何volatile表或常规表拉入R中。我没有对此进行过广泛的测试,可能会出现失败的情况,但它对我正在做的事情起作用