R - 使用 RODBC 在 SQL 服务器上更新数据

R - Updating data on SQL Server with RODBC

我正在 运行R 中编写一个脚本,然后需要将其结果发送到 SQL 服务器。

在第一个运行期间我使用了这个代码:

sqlSave(conn, df, tablename = "myschema.result_table", rownames=FALSE,
        append=FALSE, varTypes=varTypes)

因此 table 已创建,一切正常。现在我想按以下方式更新结果:

  1. 如果 Id 存在于 result_table 中,请更新内容。
  2. 如果 Id 不存在于 result_table 中,请在行后附加此 Id

问题是,如果我使用:

sqlUpdate(conn, df, tablename = "myschema.result_table", index = "Id", fast = FALSE)

一旦脚本发现 Id 不存在于 result_table 中,我就会收到错误消息。当将 sqlSaveappend=TRUE 一起使用时,所有内容都会在没有进一步检查的情况下附加,并且我得到双行。

这个问题有什么解决办法吗?还是我必须每次都创建一个新结果table,然后再将这些table合并到SQL?

有几种简单的方法可以解决这个问题:

1) 将您现有的 ID 带入 R,从您的最终数据框中提取现有 ID,根据两个数据框插入和更新。以下是如何使用 R 中的数据帧更新 table 的示例:

How to update rows in Database with values from data.frame in R conditionally

2) 将所有结果转储到 SQL 中的 table,然后 运行 更新现有 ID 的数据,插入不存在的 ID 的数据,然后清除的存储过程出来说 table.

UPDATE t
SET t.Col1 = r.Col1
FROM table t 
    JOIN tablefromr r --Existing
        ON t.ID = r.ID

INSERT INTO table
SELECT r.*
FROM tablefromr r
    LEFT JOIN table t
        ON r.ID = t.ID
WHERE t.ID IS NULL --Not Existing

TRUNCATE TABLE tablefromr

3) 将结果转储到 SQL 中的临时 table(全局,因此您可以在 R 中访问)- 然后执行与 #2 相同的步骤。

不确定这是一次性的,还是您会经常做的事情。正确答案取决于此。希望我有所帮助!