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

Posted

技术标签:

【中文标题】R - 使用 RODBC 更新 SQL Server 上的数据【英文标题】:R - Updating data on SQL Server with RODBC 【发布时间】:2018-09-11 09:54:41 【问题描述】:

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

在第一次运行时,我使用了以下代码:

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

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

    如果Id 存在于result_table 中,则更新内容。 如果Id 不存在于result_table 中,则使用此Id 追加行。

问题是,如果我使用:

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

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

有没有办法解决这个问题,还是我每次都必须创建一个新的结果表,然后在 SQL 中合并这些表?

【问题讨论】:

很难,因为与 mysql 不同,SQL Server 不直接支持ON DUPLICATE KEY 子句。一个建议是使用MERGE 语句,但我不知道你将如何从你正在使用的轻量级 R API 中做到这一点。 【参考方案1】:

有一些简单的方法可以处理这个问题:

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

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

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

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 中的临时表中(全局,因此您可以在 R 中访问) - 然后执行与 #2 相同的步骤。

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

【讨论】:

感谢您对这些方式的详细描述!稍后我将研究在继续自动化所有操作时哪个最有用。 有什么最快的方法吗?

以上是关于R - 使用 RODBC 更新 SQL Server 上的数据的主要内容,如果未能解决你的问题,请参考以下文章

在 R 中使用 RODBC 连接到 Azure SQL

使用 R RODBC 参数化 SQL 查询

使用 R 与 RODBCext 和 RODBC 执行 SQL 存储过程

在 R 中使用 RODBC 创建循环 SQL QUERY

R:使用 R 更新 SQL 表循环

以编程方式构建 SQL 查询 R/Shiny/RODBC