2013-09-26 4 views
6

Может ли кто-нибудь давать код для вызова SQL-сервера Хранимая процедура с параметром в R?вызов хранимой процедуры SQL Server с параметром в R

Это все, что я есть, и он не работает:

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() 

Спасибо.

+0

По моему опыту, соединения ODBC! = Возможность выполнить любую команду db так же, как если бы я вошел в db вручную. Возможно, зависит от водителя. Но я не думаю, что вы можете сделать что-либо, кроме вашего основного выбора/обновления/удаления и т. Д. – joran

+0

Хорошо. Есть ли какой-либо ДРУГОЙ способ вызова хранимого в SQL SERVER PROC в R с параметрами? Спасибо! – user2821029

+0

Не то, чтобы я знал, нет. Если вы можете сделать это из другого места (скажем, сценарий bash), вы можете вызвать скрипт bash из R через 'system'. Но я просто думаю, что ODBC-соединения не поддерживают это, и это единственный вариант, который я знаю для подключения к серверу sql от R. – joran

ответ

0

Вот ответ:

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

Не могли бы вы немного подробнее рассказать о своем ответе? Что такое Field1? – 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

Это ваш ответ или что? – kenorb

+2

Хотя это может ответить на вопрос, всегда полезно добавить текст в свой ответ, чтобы объяснить, что вы делаете. Прочитайте [как написать хороший ответ] (http://stackoverflow.com/help/how-to-answer). – jurgemaister

+1

SET NOCOUNT ON является ключом к решению. Хотя я еще не выяснил, как параметризовать запрос еще (просто используйте методы внедрения sql) - мне не удалось получить какие-либо данные до добавления SET NOCOUNT в мою команду. Я понимаю, почему, но не уверен, что это место для обсуждения. В основном библиотека RODBC принимает первый ответ от SQL Server (который является количеством строк из каждой подкоманды). – ripvlan

0

Я использовал решение с "SET NOCOUNT ON" версии. Но хранимая процедура была выполнена и прекратилась внезапно. Поэтому я решил использовать командную оболочку с помощью команды «sqlcmd». Здесь я сделал функцию:

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

Просто чтобы прояснить, тем в коде выше ** 's не должен быть включен в код, чтобы он должен сказать: данные < -sqlQuery (dbhandle «набор nocount on \ nEXEC my_Stored_Proc @ jyear = 2013, @ ddate = 9/25/2013 ")

Это работает для меня. Спасибо всем, кто ответил.

Смежные вопросы