2013-09-26 145 views
6

Bất kỳ ai có thể cung cấp mã để gọi máy chủ SQL Lưu trữ thủ tục với tham số trong R?gọi thủ tục lưu trữ SQL Server với tham số trong R

Đây là tất cả những gì có và nó không làm việc:

dbhandle <- odbcDriverConnect('driver={SQL Server};server=SWD-CHISSIS01;database=GlobalRiskManagement;trusted_connection=true') 
data <-sqlQuery(dbhandle, "EXEC my_Stored_Proc @jyear=2013, @ddate=9/25/2013") 
odbcCloseAll() 

Cảm ơn bạn.

+0

Theo kinh nghiệm của tôi, kết nối ODBC! = Khả năng thực hiện bất kỳ lệnh db nào giống như khi tôi đăng nhập vào db theo cách thủ công. Phụ thuộc vào người lái xe, có lẽ. Nhưng tôi không nghĩ rằng bạn có thể làm bất cứ điều gì nhưng chọn/cập nhật/xóa cơ bản của bạn, v.v. – joran

+0

Ok. Có cách nào khác để gọi một SQL SERVER được lưu trữ PROC trong R với các đại lý? Cảm ơn bạn! – user2821029

+0

Không phải là tôi biết, không. Nếu bạn có thể làm điều đó từ một nơi khác (ví dụ, một kịch bản bash), bạn có thể gọi kịch bản bash từ R thông qua 'hệ thống'. Nhưng tôi chỉ nghĩ rằng các kết nối ODBC không hỗ trợ điều này, và đó là lựa chọn duy nhất tôi biết để kết nối với máy chủ sql từ R. – joran

Trả lời

0

Dưới đây là câu trả lời:

library(RODBC) 

GetData <- function (Field1) { 
    conn<- odbcDriverConnect('driver={SQL Server};server=SERVER;database=DATABASE;trusted_connection=yes') 

    data <- sqlQuery(conn,paste("exec my_STOREDPROC @Field1= '", Field1 , "';",sep =""),errors=FALSE) 
    odbcCloseAll() 
    data 
) 
} 
+2

Bạn có thể xây dựng câu trả lời của mình một chút không? Field1 là gì? – NoThanks

1
dbhandle <- odbcDriverConnect('driver={SQL Server};server=SWD-CHISSIS01;database=GlobalRiskManagement;trusted_connection=true') 
data <-sqlQuery(dbhandle, "**set nocount on\n**EXEC my_Stored_Proc @jyear=2013, @ddate=9/25/2013") 
odbcCloseAll() 
+0

Đây là câu trả lời của bạn hoặc cái gì? – kenorb

+2

Trong khi điều này có thể trả lời câu hỏi, bạn nên đặt một số văn bản trong câu trả lời để giải thích những gì bạn đang làm. Đọc [cách viết câu trả lời hay] (http://stackoverflow.com/help/how-to-answer). – jurgemaister

+1

SET NOCOUNT ON là chìa khóa cho giải pháp. Trong khi tôi đã không tìm ra cách để tham số hóa các truy vấn được nêu ra (chỉ cần sử dụng kỹ thuật tiêm sql) - Tôi đã không thể nhận được bất kỳ dữ liệu trở lại cho đến khi thêm SET NOCOUNT vào lệnh của tôi. Tôi hiểu tại sao nhưng không chắc đây là nơi để thảo luận về nó. Về cơ bản thư viện RODBC đang dùng phản hồi đầu tiên từ SQL Server (là số đếm hàng từ mỗi lệnh phụ). – ripvlan

0

tôi đã sử dụng giải pháp với các phiên bản "SET NOCOUNT ON". Nhưng thủ tục được lưu trữ đã được thực hiện và dừng đột ngột. Vì vậy, tôi quyết định sử dụng lệnh shell bằng cách sử dụng lệnh "sqlcmd". Ở đây tôi làm một chức năng:

callStoredProc = function(server,BD,storedProc,sParams){ 
    sFileName = paste("log_",gsub(":", "_", gsub("-", "_", gsub("\\.", "_", Sys.time()))),storedProc,".txt",sep="") 
    sQuery = paste("sqlcmd -E -S ",server," -d ",BD," -Q \"EXECUTE ",storedProc," ",sParams,"\" -o \"",sFileName,"\"", sep="") 
    shell(sQuery) 
}#callStoredProc 
0

Chỉ cần làm rõ, trong đoạn code trên, ** 's nên không được đưa vào đoạn code để nó nên nói: dữ liệu < -sqlQuery (dbhandle, "bộ nocount vào \ nEXEC my_Stored_Proc @ jyear = 2013, @ ddate = 9/25/2013 ")

Điều này phù hợp với tôi. cám ơn tất cả những người đã hồi đáp.

Các vấn đề liên quan