簡體   English   中英

連接到MS SQL Server時出現RODBC臨時表問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM