无法从 R 中的 DF 更新 SQL Server 中的值

Posted

技术标签:

【中文标题】无法从 R 中的 DF 更新 SQL Server 中的值【英文标题】:Unable to Update Values in SQL Server from DF in R 【发布时间】:2021-04-14 18:16:45 【问题描述】:

想要更新 SQL Server 数据库中的值,但值没有更新。

代码运行没有任何错误。

# Df is like supp_pivot:

DateID     Buyer  Supplier  Rel    Res   Agl
--------------------------------------------
20210414    1        21     0.74  0.53  0.82
.
.
.
-------------------------------------------
#Code:

db <- odbcDriverConnect(paste0("DRIVER=SQL Server;
                                 server=",my_server,";
                                 database=",my_db,";
                                 uid=",my_username,";
                                 pwd=",my_pwd))


for(row in 1:nrow(supp_pivot))
  query <- paste0(
     "UPDATE rawcalculations SET Res = " ,supp_pivot$Res[row], 
     "Rel = " ,supp_pivot$Rel[row],  
     "Agl = " ,supp_pivot$Agl[row],  
     "WHERE DateID = " ,supp_pivot$DateID[row], 
     "BuyerID = " ,supp_pivot$Buyer[row],
     "SupplierID = " ,supp_pivot$suppliers[row]
  )
  sqlQuery(db, query)

没有收到任何错误,但数据库中的数据未更新。

【问题讨论】:

【参考方案1】:

您可以创建一个临时表并在单个查询中执行更新:

# Create temporary table
sqlSave(db, supp_pivot, tablename = "#TEMP")

query <-"
UPDATE rawcalculations 
SET rawcalculations.Res = t.Res, 
    rawcalculations.Rel = t.Rel,  
    rawcalculations.Agl = t.Agl  
FROM
    rawcalculations
INNER JOIN
    #TEMP t
ON 
rawcalculations.DateID = t.DateID, 
rawcalculations.BuyerID = t.Buyer,
rawcalculations.SupplierID = t.suppliers;" 

sqlQuery(db, query)

#Remove temporary table
sqlQuery(db,"DROP TABLE #TEMP")

请注意,在创建临时表后,您可以出于调试目的检查应更新哪些行:

SELECT * FROM 
    rawcalculations
INNER JOIN
    #TEMP t
ON 
rawcalculations.DateID = t.DateID, 
rawcalculations.BuyerID = t.Buyer,
rawcalculations.SupplierID = t.suppliers;

【讨论】:

以上是关于无法从 R 中的 DF 更新 SQL Server 中的值的主要内容,如果未能解决你的问题,请参考以下文章

无法在 R 中使用 sqlSave 追加到 SQL Server 表

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

如何从 SQL Server 中的 SELECT 更新?

使用 R 更新 SQL Server 中表的多个列

R将tbl对象更新为红移

无法更新 sql server 中的数据 - arithabort 错误