我正在使用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
如果我使用只有一行的数据帧,则矢量化代码可以正常工作。还有其他人有这个问题吗?有什么想法吗?
答案 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))
}