RODBC में संग्रहीत कार्यविधि से एकाधिक रिकॉर्डसेट पुनर्प्राप्त करने की सुविधा नहीं हो सकती है। हालाँकि, Windows ADO में NextRecordSet() है।
तरीका। RDCOMClient
. का उपयोग करके ADO को R एक COM इंटरफ़ेस कॉल करने पर विचार करें पुस्तकालय (निश्चित रूप से आप विंडोज़ के लिए आर का उपयोग करते हैं)। एडीओ के कनेक्शन ऑब्जेक्ट में, आप उसी कनेक्शन स्ट्रिंग को पास करते हैं जैसा आपने आरओडीबीसी में किया था।
एसक्यूएल सर्वर (संग्रहीत प्रक्रिया)
CREATE PROCEDURE MultipleResults
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM Table1;
SELECT * FROM Table2;
END
आर (एडीओ कॉल)
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)