【发布时间】:2017-09-07 19:28:17
【问题描述】:
当尝试使用 RODBC 中的 sqlQuery 函数使用 SQL 语句运行更新时,会出现错误
“[RODBC] 错误:无法 SQLExecDirect '。
如何使用 R 运行直接更新语句?
【问题讨论】:
-
我建议使用
odbc包(基于 DBI 规范),它甚至支持批量插入和更新(RODBC非常慢)请参阅stackoverflow.com/a/43642590/4468078
当尝试使用 RODBC 中的 sqlQuery 函数使用 SQL 语句运行更新时,会出现错误
“[RODBC] 错误:无法 SQLExecDirect '。
如何使用 R 运行直接更新语句?
【问题讨论】:
odbc 包(基于 DBI 规范),它甚至支持批量插入和更新(RODBC 非常慢)请参阅stackoverflow.com/a/43642590/4468078
您不能将普通的 SQL 更新语句与 SQL 查询函数一起使用,它只需要返回一个结果集。例如,以下语句将不起作用:
sql="update mytable set column=value where column=value"
cn <-odbcDriverConnect(connection="yourconnectionstring")
resultset <- sqlQuery(cn,sql)
但是如果你添加一个输出语句,SQL 查询功能就可以正常工作。例如。
sql="update mytable set column=value output inserted.column where column=value"
cn <-odbcDriverConnect(connection="yourconnectionstring")
resultset <- sqlQuery(cn,sql)
我刚刚添加了一个函数,可以轻松获取原始 sql 并快速将其转换为更新语句。
setUpdateSql <-function(updatesql, wheresql, output="inserted.*"){
sql=paste(updatesql," output ",output, wheresql)
sql=gsub("\n"," ",sql) #remove new lines if they appear in sql
return(sql)
}
所以现在我只需要拆分 SQL 语句,它就会运行。如果我不想返回整个内容,我还可以添加一个“inserted.columnname”。
sql=setUpdateSql("update mytable set column=value","where column=value","inserted.column")#last parameter is optional
cn <-odbcDriverConnect(connection="yourconnectionstring")
resultset <- sqlQuery(cn,sql)
此方法的另一个优点是您可以找出结果集中发生了什么变化。
【讨论】:
EXEC 中的sqlQuery 调用SP。另一种方法是使用新的基于 DBI 的包 odbc(名称中没有“R”!)。