如何在 RODBC 中运行 SQL 更新语句?

Posted

技术标签:

【中文标题】如何在 RODBC 中运行 SQL 更新语句?【英文标题】:How do I run a SQL update statement in RODBC? 【发布时间】:2017-09-07 19:28:17 【问题描述】:

当尝试使用 RODBC 中的 sqlQuery 函数使用 SQL 语句运行更新时,会出现错误

“[RODBC] 错误:无法 SQLExecDirect '。

如何使用 R 运行直接更新语句?

【问题讨论】:

我建议使用odbc 包(基于 DBI 规范),它甚至支持批量插入和更新(RODBC 非常慢)请参阅***.com/a/43642590/4468078 【参考方案1】:

您不能将普通的 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)

此方法的另一个优点是您可以找出结果集中发生了什么变化。

【讨论】:

THX,为我解决问题节省了很多时间。我通常使用存储过程来更新数据,并且可以通过EXEC 中的sqlQuery 调用SP。另一种方法是使用新的基于 DBI 的包 odbc(名称中没有“R”!)。

以上是关于如何在 RODBC 中运行 SQL 更新语句?的主要内容,如果未能解决你的问题,请参考以下文章

R - 使用 RODBC 更新 SQL Server 上的数据

SQL Server 查询因 RODBC 连接而失败,在 SQL Server 中工作

如何使用 like 语句运行 SQL 更新查询

“[RODBC] 错误:无法 SQLExecDirect”,因为在过程中插入语句

oracle 如何结束正在运行的语句

使用 CASE WHEN 语句时出现 RODBC“无效字符\n”错误