使用R与RODBCext和RODBC执行SQL存储过程

时间:2015-06-17 17:44:10

标签: r sql-server-2008 rodbc

我正在使用RODBCext包和RODBC包来使用R在SQL Server 2008中执行存储过程。如果我使用此代码,则存储过程可以正常工作。

query <- "EXEC [dbo].[usp_SchoolMerge] @Number = ?, 
                                       @Name = ?, 
                                       @Type = ?, 
                                       @Comments = ?, 
                                       @DualEnrollment =?, 
                                       @CEP = ?, 
                                       @DistrictGuidId = ?,
                                       @ImportName = ?,
                                       @ImportID = ?"

query <- gsub("[[:space:]]+", " ", query)

con2 <- odbcConnect("database", uid="userid", pwd="password")

for(i in 1:nrow(us11_12_00_school)) {

  sqlExecute(con2, query, us11_12_00_school[i,])

}

odbcClose(con2)

如果我尝试使用2.3.2使用参数化查询下的here解释的矢量化形式。

query <- "EXEC [dbo].[usp_SchoolMerge] @Number = ?, 
                                       @Name = ?, 
                                       @Type = ?, 
                                       @Comments = ?, 
                                       @DualEnrollment =?, 
                                       @CEP = ?, 
                                       @DistrictGuidId = ?,
                                       @ImportName = ?,
                                       @ImportID = ?"

query <- gsub("[[:space:]]+", " ", query)

con2 <- odbcConnect("database", uid="userid", pwd="password")

sqlExecute(con2, query, us11_12_00_school)

odbcClose(con2)

我在R中遇到此错误。

Error in sqlExecute(con2, query, us11_12_00_school) : 
  24000 0 [Microsoft][ODBC SQL Server Driver]Invalid cursor state
[RODBCext] Error: SQLExecute failed

如果我使用只有一行的数据帧,则矢量化代码可以正常工作。还有其他人有这个问题吗?有什么想法吗?

2 个答案:

答案 0 :(得分:0)

好像你只想使用us11_12_00_school的第一列 - 你在us11_12_00_school[i,]函数的循环版本中传递。在矢量化版本中,您传入整个数据帧!

我还没有对其进行测试,但我想在向量化版本中将数据框作为us11_12_00_school[1,]传递会给你预期的结果吗?

答案 1 :(得分:0)

我使用下面的代码,并且看起来运行良好。希望它对您也有帮助。

require(RODBC)
require(RODBCext)

ExecuteQuery <- function(query, arguments){

  dbhandle <- odbcDriverConnect('driver={SQL Server Native Client 11.0};server=SereverName;database=DbName;trusted_connection=yes')
  if(missing(arguments))
    result <- sqlExecute(dbhandle, query = query, fetch = TRUE)  
  else
    result <- sqlExecute(dbhandle, query =query, data=arguments, TRUE)  
  close(dbhandle)
  return(result)
}

CallProcWithSomeParams <- function(param1, param2){

  ExecuteQuery('exec dbo.procName ?, ?', data.frame(param1, param2))
}