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

Posted

技术标签:

【中文标题】使用 R 与 RODBCext 和 RODBC 执行 SQL 存储过程【英文标题】:Using R with RODBCext and RODBC to execute a SQL stored procedure 【发布时间】:2015-06-17 17:44:10 【问题描述】:

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

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

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

【问题讨论】:

您是否同时加载了RODBCRODBCext?如果是这样,可能存在命名空间冲突,可以通过使用 RODBCext::sqlExecute 而不仅仅是 sqlExecute 来解决。 我确实同时加载了 RODBCRODBCextRODBCRODBCext 所必需的。我尝试使用RODBCext::sqlExecute(con2, query, us11_12_00_school),但我得到了同样的错误 【参考方案1】:

似乎您只想使用us11_12_00_school 的第一列 - 您使用us11_12_00_school[i,] 在函数的循环版本中传递它。但是,在矢量化版本中,您传递了整个数据框!

我还没有测试过,但我想在矢量化版本中将数据帧作为us11_12_00_school[1,] 传递会给你预期的结果?

【讨论】:

【参考方案2】:

我使用下面的代码,似乎运行良好。希望对你也有帮助。

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

【讨论】:

以上是关于使用 R 与 RODBCext 和 RODBC 执行 SQL 存储过程的主要内容,如果未能解决你的问题,请参考以下文章

R RODBCext 和参数化 IN 语句?

与 Oracle 数据库的 RODBC 连接不起作用,崩溃 R

RODBC sqlSave 崩溃 R 前端

Python 2.7 pyodbc 或 pymssql 与 R RODBC

使用 R studio 连接到 dashDB 的 RODBC

RODBC 包的替代方案,用于从 R 连接到 MS Access