So lesen Sie mehrere Ergebnismengen, die von einer gespeicherten SQL server-Prozedur in R zurückgegeben werden

Wie erfasse ich mehrere Tabellen, die von einem gespeicherten Prozeduraufruf zurückgegeben werden?

conn<- odbcDriverConnect('driver={SQL server};server=server;database=db;trusted_connection=yes') data <- sqlQuery(conn,paste("exec dbo.GetTest"),errors=FALSE) 

Es erfasst nur die erste Tabelle, die in einer list zurückgegeben wird.

RODBC verfügt möglicherweise nicht über eine function, um mehrere Recordsets aus einer gespeicherten Prozedur abzurufen. Windows ADO hat jedoch die NextRecordSet () – Methode. RDCOMClient Sie, dass Sie einen COM-interfacenaufruf zu ADO mit der RDCOMClient Bibliothek machen (vorausgesetzt, natürlich verwenden Sie R für Windows). Im ADO-Verbindungsobjekt übergeben Sie die gleiche Verbindungszeichenfolge wie in RODBC.

Unten ruft Abfrageergebnisse mit dem GetRows () von ADO ab, das ein zweidimensionales Array zurückgibt, das als verschachtelte listn in R übersetzt wird.

SQL server (Gespeicherte Proc)

 CREATE PROCEDURE MultipleResults AS BEGIN SET NOCOUNT ON; SELECT * FROM Table1; SELECT * FROM Table2; END 

R (ADO Anruf)

 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)