2011-01-20 15 views
13

私はUNIX上でRを実行しています.RODBCパッケージを使用してMS SQLサーバーに接続しています。パッケージで結果を返すクエリを実行できますが、SQLクエリのどこかに一時テーブルを使用すると、空の文字列が返されます。 Web上を見た後、RODBCパッケージは、エンドユーザーが標準SQL(MS SQLとは対照的)で書いていると仮定して書かれたものと考えられます。私は例として以下のコードを提供しました。MS SQL Serverに接続するときのRODBC一時テーブルの問題

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) 

答えて

3

問題は、あなたのSQL構文ではなく、RまたはRODBCパッケージに固有のものであるように思われます。最初の文が2番目と3番目の前に実行されたことを確認するには、goコマンドでSQL文を区切る必要があります。あるいは、以下のように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) 

と出力EDIT

は、リストオブジェクトにクエリのすべてを回すと、それらを反復がにあなたにいくつかのコーディングを救うことができる

> doesItWork 
    test 
1 2 

未来。たとえば:

queryList <- list(qry1, qry2, qry3, qry4) 
sqlOutput <- lapply(queryList, function(x) sqlQuery(ch, x)) 

これは、あなたが気にしないかもしれないが、あなたが興味を持っている結果は、3が対象のクエリを表しsqlOutput[[3]]で引っ張ることができるいくつかの余分な出力を生成します。

+0

同様R.で一時テーブルを使用したスト​​アドプロシージャを使用することができました。限り、私のクエリを1つの文字列に入れて、私は行くコマンドで文を分離するか分からない。これはTransact SQLを使用して私の機能ですか? – rlh2

+0

@Bob - SQLのさまざまな味やSQLとのRインターフェースが、なぜそれが異なる動作をするのかを知るための「通常の」インターフェースとは根本的に異なる方法については十分に分かりません。私は上記のすべてのクエリを強調表示し、管理スタジオを介して実行する場合、それは正常に動作しますか? Rで別のクエリを実行して動作させる必要があると仮定すると、それらをすべてリストに変換して 'lapply()'を使うことができます。私はこの方法を反映するために答えを更新します。 – Chase

+0

@Bob BTW一時テーブルを作成して接続を閉じるときに消えるため、 'drop table'は必要ないと思います。 – Marek

22

RODBCドライバは、SQL Serverがステートメント全体が完了した行数を返すと考えるようです。したがって、ステートメントまたは呼び出されるストアドプロシージャの先頭にnocountを設定する必要があります。

set nocount on 

この

は私が最初にオフ、助けのためのおかげで、あなたの方法は、私の作品

+0

これは信じられないほどです。このChrisGheenに感謝します。 – Moderat

関連する問題