我在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)
答案 0 :(得分:32)
RODBC驱动程序似乎认为当SQL Server返回整个语句完成的任何行数时。因此,您需要在语句或调用的存储过程的开头设置nocount。
set nocount on
这允许我使用在R。
中使用临时表的存储过程答案 1 :(得分:3)
问题似乎出现在您的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表示感兴趣的查询。