RODBC mungkin tidak memiliki fitur untuk mengambil beberapa recordset dari prosedur tersimpan. Namun, Windows ADO memiliki NextRecordSet()
metode. Pertimbangkan agar R melakukan panggilan antarmuka COM ke ADO menggunakan RDCOMClient
library (dengan asumsi tentu saja Anda menggunakan R untuk Windows). Di objek koneksi ADO, Anda meneruskan string koneksi yang sama seperti yang Anda lakukan di RODBC.
Di bawah ini mengambil hasil kueri dengan GetRows()
SQL Server (Proc Tersimpan)
CREATE PROCEDURE MultipleResults
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM Table1;
SELECT * FROM Table2;
END
B (Panggilan 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)