sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan læser du flere resultatsæt returneret fra en SQL Server-lagret procedure i R

RODBC har muligvis ikke en funktion til at hente flere registreringssæt fra en lagret procedure. Windows ADO har dog NextRecordSet() metode. Overvej at få R til at foretage et COM-grænsefladekald til ADO ved hjælp af RDCOMClient bibliotek (forudsat selvfølgelig at du bruger R til Windows). I ADO's forbindelsesobjekt sender du den samme forbindelsesstreng, som du gjorde i RODBC.

Nedenfor henter forespørgselsresultater med ADO's GetRows() som returnerer en todimensional matrix oversat som indlejrede lister i R.

SQL-server (Lagret Proc)

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

R (ADO-opkald)

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)



  1. Hvordan opretter man en datetime fra dele i Oracle/PLSQL?

  2. Det serialiserbare isolationsniveau

  3. Skalering af din tidsseriedatabase - Sådan skalerer du ganske enkelt TimescaleDB

  4. Hvordan kan jeg oprette en tabel med orakel, men med små tegn?