25

我在 unix 上运行 R,并且正在使用 RODBC 包连接到 MS SQL 服务器。我可以使用包执行返回结果正常的查询,但是如果我在 SQL 查询的某处使用临时表,则会向我返回一个空字符串。查看网络后,我认为问题可能是假设最终用户使用标准 SQL(而不是 MS SQL)编写 RODBC 包。我提供了以下代码作为示例。

有趣的是,如果我使用 RJDBC 包,则不存在临时表问题。但是,即使导入 80,000 行(10 列),RJDBC 包也非常缓慢,并且会经常停止,因此这也不是一种选择。有没有其他人遇到过这个问题?如果有我没有想到的替代解决方案,我很想听听。

看来我不是唯一一个有这个问题的人,也许这是一个 R-Bug? http://r.789695.n4.nabble.com/RODBC-results-from-stored-procedure-td897462.html

谢谢

这是R示例:

library(RODBC)
ch <- odbcConnect(insert your server info here)
qry4 <- "create table #tempTable(
    Test int
)
insert into #tempTable
select 2

select * from #tempTable
drop table #tempTable
"
df4 <- sqlQuery(ch, qry4)
4

2 回答 2

48

RODBC 驱动程序似乎认为,当 SQL Server 返回任何行数时,整个语句就完成了。因此,您需要在调用的语句或存储过程的开头设置 nocount on。

set nocount on

这允许我使用在 R 中使用临时表的存储过程。

于 2012-07-11T00:03:38.707 回答
5

问题似乎出在您的 SQL 语法中,而不是 R 或 RODBC 包固有的任何内容。我相当确定您需要将 SQL 语句与go命令分开,以确保第一个语句在第二个和第三个语句之前完成执行,依此类推。或者,您可以将它们分解为四个不同的语句,如下所示。这适用于我的机器:

library(RODBC)
ch <- odbcConnect("details")

qry1 <- "create table #temptable (test int)"
qry2 <- "insert into #temptable(test) values(2)"
qry3 <- "select * from #temptable"
qry4 <- "drop table #temptable"

sqlQuery(ch, qry1)
sqlQuery(ch, qry2)
doesItWork <- sqlQuery(ch, qry3)
sqlQuery(ch, qry4)

和输出

> doesItWork
  test
1    2

编辑

将所有查询转换为列表对象并遍历它们可以在将来为您节省一些编码。例如:

queryList <- list(qry1, qry2, qry3, qry4)
sqlOutput <- lapply(queryList, function(x) sqlQuery(ch, x))

这将生成一些您可能不关心的无关输出,但是可以使用sqlOutput[[3]]3 表示感兴趣的查询来提取您感兴趣的结果。

于 2011-01-20T14:26:57.087 回答