连接到MS SQL Server时出现RODBC临时表问题

rlh*_*lh2 19 sql sql-server r rodbc

我在unix上运行R,我使用RODBC包连接到MS SQL服务器.我可以执行一个使用包返回结果的查询,但如果我在SQL查询的某处使用临时表,则返回一个空字符串给我.在浏览网页后,我认为问题可能是RODBC软件包是在最终用户使用标准SQL(而不是MS SQL)编写的时候编写的.我提供了以下代码作为示例.

有趣的是,如果我使用RJDBC包,则不存在临时表问题.但是,RJDBC软件包输入甚至80,000行(10列)的速度非常慢,并且会经常停顿,所以这也不是一个选择.有没有其他人遇到这个问题?如果有其他解决方案我没有想到,我很乐意听到它们.

看来我不是唯一有这个问题的人,也许这是一个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)
Run Code Online (Sandbox Code Playgroud)

Chr*_*een 37

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

set nocount on
Run Code Online (Sandbox Code Playgroud)

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


Cha*_*ase 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)
Run Code Online (Sandbox Code Playgroud)

和输出

> doesItWork
  test
1    2
Run Code Online (Sandbox Code Playgroud)

编辑

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

queryList <- list(qry1, qry2, qry3, qry4)
sqlOutput <- lapply(queryList, function(x) sqlQuery(ch, x))
Run Code Online (Sandbox Code Playgroud)

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