【问题标题】:R and MSSQL - communication with temp tables (table not found on channel)R 和 MSSQL - 与临时表通信(在通道上找不到表)
【发布时间】:2017-04-17 17:52:14
【问题描述】:

我正在尝试通过以下方式使用 RODBC 更新全局临时表:

library(RODBC)
channel <- odbcConnect("RDataSource", uid = "user", pwd = "password")    
query <- "select * from ##TempTable"
table_data <- sqlQuery(channel, query)
# data frame creation
sqlUpdate(channel, data_frame, index = "id", verbose = TRUE, tablename = "##TempTable")

选择查询执行良好,但 sqlUpdate 失败并显示错误消息: “odbcTableExists(channel, tablename) 中的错误:‘##TempTable’:在通道上找不到表”

我想这个错误的原因可能与在临时表的名称中使用“#”有关。

UPD:我在使用 sqlSave 函数时遇到了同样的错误。此错误仅在我创建临时表时发生,通常的 SQL 表一切正常。 全局临时表在调用 R 代码之前创建。

那么,有没有什么方法可以使用 sqlSave() 和 sqlUpdate() 等 R 函数与 MSSQL 数据库中的临时表进行通信?

【问题讨论】:

  • 它可能是字符扔掉它,它也可能需要一个模式名称。我会将 schema = "" 添加到您的命令中,看看是否有帮助。您也可以尝试将表的名称更改为更适合 sql 的名称;)
  • 在 SQL Server 中,以双哈希为前缀的表名是 global temp tables,在 any 用户连接期间创建,并在 所有 用户断开连接时删除.您或任何用户是否在并发实例期间运行 R 代码之前创建了此 ##TempTable
  • 是的,在我的例子中,全局临时表是在调用 R 脚本执行之前创建的。另外,我可以通过调用 sqlQuery() 函数来更新这个表,但是 sqlUpdate() 或 sqlSave() 函数执行失败。

标签: sql sql-server r rodbc


【解决方案1】:

我终于发现这个错误的原因是在ODBC数据源的设置中。似乎使用 R 函数(如 sqlSave 或 sqlUpdate)与临时表进行通信需要将 ODBC 数据源中的默认数据库设置为“tempdb”。 所以,现在我可以使用 sqlSave() 函数在临时表中插入值。这个函数实际上比使用直接'INSERT'查询作为参数的sqlQuery函数有更好的性能。

【讨论】:

  • 也许 FQN 也可以工作,而不是更改更改默认数据库 (select * from tempdb..##TempTable)
猜你喜欢
  • 2013-06-18
  • 2013-04-15
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多