Как использовать обновление и присоединиться к OPENQUERY

У меня есть несколько строк в таблице SQL Server 2008 R2 в

ConfirmTable (ItemID, Barcode)

и другие строки в заголовочном файле DB2

O1 (ItemId, barcode, ProductionUnit, OwnerName, Delivered, Qty)

и Подробный файл

O2 (ItemId, barcode, Address, ItemName, Delivered, TotalLines)

Я хочу обновить статус DELIVERED в файлах O1 и O2 на «YES», если ItemID и Barcode существуют в ConfirmTable. Я пытаюсь использовать следующий запрос, но, похоже, он показывает следующую ошибку.

Поставщик OLE DB "DB2OLEDB" для связанного сервера "LINK_DB" вернул сообщение "Недостаточно информации о ключевом столбце для обновления или обновления".

Код:

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

Я также пробовал следующий формат обновления, но он у меня не работал.

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


person Denn    schedule 24.08.2015    source источник
comment
Итак, вы хотели обновить таблицу, удаленную через связанный сервер?   -  person Lukasz Szozda    schedule 24.08.2015
comment
Да! К вашему сведению: запрос Select отлично работает с приведенным выше запросом.   -  person Denn    schedule 24.08.2015
comment
Согласен, но то, чего вы хотите добиться, вам скорее нужно EXECUTE (sql) AT linked_server. Во-вторых, OQ является результатом JOIN, а не одной таблицы, так как вы хотите обновить ее, если она была локально?   -  person Lukasz Szozda    schedule 24.08.2015
comment
Извиняюсь! Просто осознайте. Удален ItemID оттуда. Единственный способ увидеть товар - по штрих-коду.   -  person Denn    schedule 24.08.2015
comment
В первую очередь, какую таблицу следует обновить XXXXR.LIB.O1 или XXXXR.HLIB.O1?   -  person Lukasz Szozda    schedule 24.08.2015
comment
Обе таблицы, но я не уверен, что смогу обновить их обе вместе.   -  person Denn    schedule 24.08.2015
comment
Вообще говоря, DB2 не позволит вам обновить результирующий набор, являющийся объединением двух или более таблиц.   -  person mustaccio    schedule 24.08.2015
comment
Спасибо Lads2025 и mustaccio за то, что попробовали. Вам это кажется правильным? Начать СДЕЛКУ; UPDATE OQ ' SET OQ.Delivered='YES' FROM OPENQUERY(LINK_DB, 'SELECT * FROM XXXXR.HLIB.O1 O1O WHERE O1O.Qty › 0') OQ INNER JOIN ConfirmTable CT ON CT.ItemID = OQ.ItemID UPDATE OQ SET OQ2.Delivered='YES' FROM OPENQUERY(LINK_DB, 'SELECT * FROM XXXXR.HLIB.O2 O2O) OQ2 INNER JOIN ConfirmTable CT ON CT.Barcode = OQ2.Barcode COMMIT   -  person Denn    schedule 24.08.2015


Ответы (1)


Это старый пост, но теперь я разбираюсь с ним.

Не используйте объединение в OPENQUERY

например что-то в этом роде

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
person Kamil Mazur    schedule 29.03.2016
comment
Спасибо за попытку, давно исправил. - person Denn; 03.04.2016
comment
Спасибо за публикацию, @Denn не единственный, кто пытается заставить это работать, как показывает количество просмотров на этой странице. - person Mathieu Guindon; 10.07.2018