在 RODBC 中执行以分号分隔的多条语句
Posted
技术标签:
【中文标题】在 RODBC 中执行以分号分隔的多条语句【英文标题】:Execute multiple statements separated by semicolons in RODBC 【发布时间】:2017-08-15 13:53:50 【问题描述】:我有一个相当复杂的 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 Server。
注意:我之前问过这个问题,它被标记为与this question 重复,但他们问的是完全不同的问题。在这个问题中,我想执行一个包含多个语句的脚本,而在另一个问题中,作者只尝试执行一个语句。
【问题讨论】:
在选择并运行之前尝试删除\n
。
@lad2025 不好
q <- "DECLARE @VARX CHAR = 'X' SELECT * FROM TABLE WHERE TYPE = @VARX"
AFAIK - 您只能在 ODBC 连接中发送一个 SQL 调用。对于多个查询,使用存储过程并从 R 调用/执行它。对于您的示例,只需从 R 传递参数而不使用 DECLARE
。
@lad2025 似乎仍然不起作用。
【参考方案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
此时设置 odbc 连接并运行下面的 for 循环。您还可以在运行 for 循环之前修改查询以在查询中添加/更改变量
for (i in 1:length(queries3))
print(i)
sqlQuery(conn, queries3[i])
在 for 循环完成后,您可以使用 sqlQuery() 将会话中生成的任何易失或常规表拉入 R。我没有对此进行过广泛的测试,可能会出现失败的情况,但它对我正在做的事情有效
【讨论】:
以上是关于在 RODBC 中执行以分号分隔的多条语句的主要内容,如果未能解决你的问题,请参考以下文章