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
中,我就会收到错误消息。将sqlSave
与append=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 上的数据的主要内容,如果未能解决你的问题,请参考以下文章