2017-04-17 42 views
2

我想以更新如下方式使用RODBC全局臨時表:R和MSSQL - 用臨時表通信(通道未發現表)

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代碼之前創建全局臨時表。

那麼,有沒有什麼辦法使用R函數(如sqlSave()和sqlUpdate())與MSSQL數據庫中的臨時表進行通信?

+1

它可能是字符拋出它,它也可能是想要一個模式名稱。我會將schema =「」添加到您的命令中,看看是否有幫助。你也可以嘗試改變表的名稱,以更友好的SQL;) – ike

+0

在SQL Server中,雙哈希前綴表名稱是[全局臨時表](http://stackoverflow.com/a/21011451/1422451)在任何*用戶的連接期間創建,並在所有**用戶斷開連接時刪除。在併發實例期間運行R代碼之前,您或任何用戶是否創建了這個'## TempTable'? – Parfait

+0

是的,在我的情況下,全局臨時表是在調用R腳本執行之前創建的。另外,我可以通過調用sqlQuery()函數來更新此表,但sqlUpdate()或sqlSave()函數無法執行。 – floyd

回答

2

我終於發現這個錯誤的原因是在ODBC數據源的設置中。看起來,使用R函數(如sqlSave或sqlUpdate)與臨時表進行通信需要將ODBC數據源中的默認數據庫設置爲'tempdb'。 所以,現在我可以使用sqlSave()函數在臨時表中插入值。這個函數實際上比直接使用「INSERT」查詢作爲參數的sqlQuery函數具有更好的性能。