RODBC có thể không có tính năng truy xuất nhiều tập bản ghi từ một thủ tục được lưu trữ. Tuy nhiên, Windows ADO có NextRecordSet ()
phương pháp. Cân nhắc để R thực hiện cuộc gọi giao diện COM tới ADO bằng RDCOMClient
thư viện (giả sử tất nhiên bạn sử dụng R cho Windows). Trong đối tượng kết nối của ADO, bạn chuyển cùng một chuỗi kết nối như bạn đã làm trong RODBC.
Bên dưới truy xuất kết quả truy vấn với GetRows ()
Máy chủ SQL (Proc được lưu trữ)
CREATE PROCEDURE MultipleResults
AS
BEGIN
SET NOCOUNT ON;
SELECT * FROM Table1;
SELECT * FROM Table2;
END
R (Cuộc gọi 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)