使用 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
如果我使用只有一行的数据框,则矢量化代码可以工作。还有其他人有这个问题吗?有什么想法吗?
【问题讨论】:
您是否同时加载了RODBC
和RODBCext
?如果是这样,可能存在命名空间冲突,可以通过使用 RODBCext::sqlExecute
而不仅仅是 sqlExecute
来解决。
我确实同时加载了 RODBC
和 RODBCext
。 RODBC
是 RODBCext
所必需的。我尝试使用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 存储过程的主要内容,如果未能解决你的问题,请参考以下文章
与 Oracle 数据库的 RODBC 连接不起作用,崩溃 R
Python 2.7 pyodbc 或 pymssql 与 R RODBC