Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como ler vários conjuntos de resultados retornados de um procedimento armazenado do SQL Server em R


O RODBC pode não ter um recurso para recuperar vários conjuntos de registros de um procedimento armazenado. No entanto, o Windows ADO tem o NextRecordSet() método. Considere fazer com que R faça uma chamada de interface COM para ADO usando o RDCOMClient biblioteca (supondo, é claro, que você use R para Windows). No objeto de conexão do ADO, você passa a mesma cadeia de conexão que fez no RODBC.

Abaixo recupera os resultados da consulta com GetRows() que retorna uma matriz bidimensional traduzida como listas aninhadas em R.

SQL Server (Proc Armazenado)
CREATE PROCEDURE MultipleResults 
AS    
BEGIN
    SET NOCOUNT ON;
    SELECT * FROM Table1;
    SELECT * FROM Table2;
END

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