25

UNIX で R を実行しており、RODBC パッケージを使用して MS SQL サーバーに接続しています。パッケージで問題なく結果を返すクエリを実行できますが、SQL クエリのどこかで一時テーブルを使用すると、空の文字列が返されます。Web を調べた結果、エンド ユーザーが (MS SQL ではなく) 標準 SQL で記述していると想定して RODBC パッケージが記述されていることが問題である可能性があると思います。例として以下のコードを提供しました。

興味深いことに、RJDBC パッケージを使用すると一時テーブルの問題は発生しません。ただし、RJDBC パッケージは 80,000 行 (10 列) のインポートでも非常に遅く、頻繁に停止するため、これもオプションではありません。他の誰かがこの問題に遭遇しましたか? 私が思いつかなかった別の解決策があれば、ぜひ聞いてみたいです。

この問題を抱えているのは私だけではないようです。おそらくこれは R バグですか? 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)
4

2 に答える 2

5

問題は、R や RODBC パッケージに固有のものではなく、SQL 構文にあるようです。SQL ステートメントをコマンドで分離goして、最初のステートメントが 2 番目、3 番目などの前に実行を完了したことを確認する必要があることは確かです。または、以下で行ったように、それらを 4 つの異なるステートメントに分割することもできます。これは私のマシンで動作します:

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 が関心のあるクエリを表す場所で取得できます。

于 2011-01-20T14:26:57.087 に答える