2013-09-26 41 views
6

任何人都可以提供代码来调用SQL服务器R中的参数存储过程?调用R参数中的SQL Server存储过程

这是我的全部,它不工作:

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命令,就像我手动登录数据库一​​样。可能取决于司机。但我不认为你可以做任何事情,但你的基本选择/更新/删除等。 – joran

+0

好的。有没有其他的方法来调用R中的SQL SERVER存储PROC与参数?谢谢! – user2821029

+0

不是我知道的,没有。如果你可以从其他地方(比如bash脚本)做到,你可以通过'system'从R中调用bash脚本。但我只是认为ODBC连接不支持这一点,这是我知道的从R连接到sql server的唯一选项。 – 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” 版本的解决方案。但存储过程被执行并突然停止。所以我决定使用命令shell使用“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

只是为了澄清,将在上面的代码中,**的不应该包含在代码,所以应该说: 数据< -sqlQuery(数据库句柄,“集在\ nEXEC my_Stored_Proc @ jyear = 2013,@ ddate = 9/25/2013" )NOCOUNT

这对我的作品。感谢所有回复的人。