我有一个相当复杂的 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。
注意:我之前问过这个问题,它被标记为这个问题的重复,但他们问的是完全不同的事情。在这个问题中,我想执行一个包含多个语句的脚本,而在另一个问题中,作者只想执行一个语句。
你可以试试这个:
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 中。我还没有对此进行广泛的测试,并且在某些情况下它可能会失败,但它对我正在做的事情有效