sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man läser flera resultatuppsättningar som returneras från en SQL Server-lagrad procedur i R

RODBC kanske inte har en funktion för att hämta flera postuppsättningar från en lagrad procedur. Windows ADO har dock NextRecordSet() metod. Överväg att låta R göra ett COM-gränssnittsanrop till ADO med RDCOMClient bibliotek (förutsatt att du förstås använder R för Windows). I ADO:s kopplingsobjekt skickar du samma kopplingssträng som du gjorde i RODBC.

Nedan hämtar frågeresultat med ADO:s GetRows() som returnerar en tvådimensionell matris översatt som kapslade listor i R.

SQL-server (Lagrad proc)

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

R (ADO-samtal)

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. PDOException "kunde inte hitta drivrutinen"

  2. Databaseffektivitet/strukturproblem

  3. max(längd(fält)) i mysql

  4. Konvertera mysql binär till postgresql bytea