如何在 OPENQUERY 中使用更新和加入

Den*_*enn 1 sql-server db2 join linked-server sql-update

我在 SQL Server 2008 R2 表中有几行

ConfirmTable (ItemID, Barcode)
Run Code Online (Sandbox Code Playgroud)

以及 DB2 头文件中的更多行

O1 (ItemId, barcode, ProductionUnit, OwnerName, Delivered, Qty)
Run Code Online (Sandbox Code Playgroud)

和详细文件

O2 (ItemId, barcode, Address, ItemName, Delivered, TotalLines)
Run Code Online (Sandbox Code Playgroud)

如果ItemIDBarcode存在于ConfirmTable. 我正在尝试使用以下查询,但似乎显示以下错误。

链接服务器“LINK_DB”的 OLE DB 提供程序“DB2OLEDB”返回消息“更新或刷新的键列信息不足。”

代码:

UPDATE OQ 
SET OQ.Delivered='YES'
FROM OPENQUERY(LINK_DB, 'SELECT * 
                         FROM XXXXR.HLIB.O1 O1O 
                         LEFT JOIN XXXXR.HLIB.O2 O2O ON O1O.ItemID = O2O.ItemID 
                         WHERE O1O.Qty > 0') OQ 
INNER JOIN 
    ConfirmTable CT ON CT.Barcode = OQ.Barcode
Run Code Online (Sandbox Code Playgroud)

我也尝试了以下更新格式,但它对我不起作用。

http://www.experts-exchange.com/questions/28390846/OPENQUERY-in-sql-server-linked-server.html

小智 5

这是旧帖子,但现在我处理它。

不要在 OPENQUERY 中使用 join

例如类似的东西

UPDATE OQ 
SET OQ.Delivered='YES'
FROM OPENQUERY(LINK_DB, 'SELECT * FROM XXXXR.HLIB.O1') OQ
JOIN OPENQUERY(LINK_DB, 'SELECT * FROM XXXXR.HLIB.O2') QQ2 ON QQ.ItemID = QQ2.ItemID  
INNER JOIN ConfirmTable CT ON CT.Barcode = OQ.Barcode
WHERE QQ2.Qty > 0
Run Code Online (Sandbox Code Playgroud)

  • 感谢您发帖,正如本页上的浏览次数所示,@Denn 并不是唯一一个尝试使其发挥作用的人。 (4认同)