在 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 &lt;- "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 中执行以分号分隔的多条语句的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript语句

JavaScript 语句

05JavaScript语句

初涉JavaScript 3

初涉JavaScript 3

作业三总结