sql >> Database >  >> RDS >> Sqlserver

Meerdere resultaatsets lezen die zijn geretourneerd door een SQL Server-opgeslagen procedure in R

RODBC heeft mogelijk geen functie om meerdere recordsets uit een opgeslagen procedure op te halen. Windows ADO heeft echter wel de NextRecordSet() methode. Overweeg R een COM-interface-aanroep naar ADO te laten doen met behulp van de RDCOMClient bibliotheek (ervan uitgaande dat u natuurlijk R voor Windows gebruikt). In het verbindingsobject van ADO geef je dezelfde verbindingsreeks door als in RODBC.

Hieronder worden queryresultaten opgehaald met ADO's GetRows() die een tweedimensionale array retourneert, vertaald als geneste lijsten in R.

SQL-server (Opgeslagen Proc)

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

R (ADO-oproep)

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. Een string invoegen in een andere string in SQL Server met STUFF()

  2. MySQL-fout:onjuist gebruik van UPDATE en LIMIT

  3. De SQL Server Agent XP's inschakelen met T-SQL

  4. SQLEXCEPTION-bericht ophalen in procedures MySQL 5.5.x