[英]RODBC Temporary Table Issue when connecting to MS SQL Server
我在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)
RODBC驅動程序似乎認為當SQL Server返回整個語句完成的任何行數時。 因此,您需要在語句的開頭或調用的存儲過程中設置nocount。
set nocount on
這允許我使用在R中使用臨時表的存儲過程。
問題似乎出現在您的SQL語法中,而不是R或RODBC包中固有的任何問題。 我很確定你需要用go
命令分離你的SQL語句,以確保第一個語句在第二個語句和第三個語句之前完成執行,依此類推。 或者,您可以將它們分解為四個不同的語句,如下所示。 這適用於我的機器:
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表示感興趣的查詢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.