RODBC heeft mogelijk geen functie om meerdere recordsets uit een opgeslagen procedure op te halen. Windows ADO heeft echter wel de NextRecordSet()
methode. Overweeg R een COM-interface-aanroep naar ADO te laten doen met behulp van de RDCOMClient
bibliotheek (ervan uitgaande dat u natuurlijk R voor Windows gebruikt). In het verbindingsobject van ADO geef je dezelfde verbindingsreeks door als in RODBC.
Hieronder worden queryresultaten opgehaald met ADO's GetRows() die een tweedimensionale array retourneert, vertaald als geneste lijsten in R.
SQL-server (Opgeslagen Proc)
CREATE PROCEDURE MultipleResults
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM Table1;
SELECT * FROM Table2;
END
R (ADO-oproep)
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)