sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo leer múltiples conjuntos de resultados devueltos por un procedimiento almacenado de SQL Server en R

Es posible que RODBC no tenga una función para recuperar varios conjuntos de registros de un procedimiento almacenado. Sin embargo, Windows ADO tiene el NextRecordSet() método. Considere hacer que R haga una llamada de interfaz COM a ADO usando el RDCOMClient biblioteca (asumiendo, por supuesto, que usa R para Windows). En el objeto de conexión de ADO, pasa la misma cadena de conexión que en RODBC.

A continuación, se recuperan los resultados de la consulta con GetRows() que devuelve una matriz bidimensional traducida como listas anidadas en R.

Servidor SQL (Proceso almacenado)

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

R (Llamada 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)