【问题标题】:RODBC Temporary Table Issue when connecting to MS SQL Server连接到 MS SQL Server 时出现 RODBC 临时表问题
【发布时间】:2011-06-12 11:27:05
【问题描述】:

我在 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)

【问题讨论】:

    标签: sql sql-server r rodbc


    【解决方案1】:

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

    set nocount on
    

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

    【讨论】:

    • 这太不可思议了。非常感谢这个 ChrisGheen。
    • 这对我帮助很大——我可以将长时间运行的脚本用于临时表、插入、删除等,直到我运行最后一个 select 语句。我将它用于带有 R 的 DBI/ODBC。
    • 对我没有帮助?!
    【解决方案2】:

    问题似乎出在您的 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 代表感兴趣的查询。

    【讨论】:

    • 首先,感谢您的帮助,您的方法也适用于我。至于将我的查询放入一个字符串中,我不确定用 go 命令分隔语句是否有效。这可能是我使用 Transact SQL 的一个功能吗?
    • @Bob - 我不太了解 SQL 的各种风格,也不知道 R 接口与 SQL 的接口与“普通”接口有何根本不同,不知道为什么它的行为会有所不同。我假设如果您突出显示上面的所有查询并通过管理工作室运行它,它工作正常吗?假设您需要在 R 中使用单独的查询来使其工作,您可以将它们全部转换为一个列表并使用lapply()。我会更新答案以反映这种方法。
    • @Bob BTW 我认为 drop table 是不需要的,因为你创建了临时表,所以当你关闭连接时它会消失。
    • 另一方面,我认为这解释了为什么创建和操作临时表的存储过程不适用于 RODBC。
    猜你喜欢
    • 2012-11-25
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 2011-08-31
    • 2021-06-18
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多