如何在 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 中工作