RODBCには、ストアドプロシージャから複数のレコードセットを取得する機能がない場合があります。ただし、WindowsADOにはRDCOMClient
を使用してRにADOへのCOMインターフェイス呼び出しを行わせることを検討してください。 ライブラリ(もちろん、R for Windowsを使用していると仮定します)。 ADOの接続オブジェクトでは、RODBCで行ったのと同じ接続文字列を渡します。
以下は、ADOの GetRows()<を使用したクエリ結果を取得します。 / a> これは、Rでネストされたリストとして変換された2次元配列を返します。
SQL Server (ストアドプロシージャ)
CREATE PROCEDURE MultipleResults
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM Table1;
SELECT * FROM Table2;
END
R (ADOコール)
library(RDCOMClient)
conn <- COMCreate("ADODB.Connection")
rst <- COMCreate("ADODB.Recordset")
conn$Open("driver={SQL Server};server=server;database=db;trusted_connection=yes;")
# FIRST QUERY RESULT
rst$Open("MultipleResults", conn)
dfList1 <- rst$GetRows()
# RETRIEVE COLUMN NAMES
dfnames1 <- vapply(c(0:(rst[['Fields']]$Count()-1)),
function(i) (rst$Fields(i)$Name()), character(1))
# SECOND QUERY RESULT
rst <- rst$NextRecordset()
dfList2 <- rst$GetRows()
# RETRIEVE COLUMN NAMES
dfnames2 <- vapply(c(0:(rst[['Fields']]$Count()-1)),
function(i) (rst$Fields(i)$Name()), character(1))
# CLOSE OBJECTS
rst$Close(); conn$Close()
# FREE RESOURCES
rst <- conn <- NULL
rm(rst, conn)
gc()
# CONVERT NESTED LISTS TO DATAFRAMES
dfList1 <- lapply(dfList1, function(x) setNames(data.frame(x), dfnames1))
df1 <- do.call(rbind, dfList1)
dfList2 <- lapply(dfList2, function(x) setNames(data.frame(x), dfnames2))
df2 <- do.call(rbind, dfList2)