Как выбрать во временную таблицу и обновить сразу - PullRequest
0 голосов
/ 09 ноября 2018

MySql связан с сервером Sql как STATION_TEST. Я хочу ввести следующие результаты выбора во временную таблицу и обновить. Выберите запрос:

SELECT * INTO #MYSqlRFID_Prod FROM OPENQUERY(STATION_TEST,'select * from deslocal.RFID_Prod WHERE valid = ''N''');

Я не могу выбрать дважды для обновления, потому что запись таблицы RFID_Prod выполняется каждый раз. Если я сделаю запрос, как это:

UPDATE OPENQUERY(STATION_TEST,'SELECT id,valid FROM deslocal.RFID_Prod WHERE valid = ''N''') SET valid = 'Y';

Боюсь, что выбранные результаты будут отличаться от первого выбора.

1 Ответ

0 голосов
/ 09 ноября 2018

Вы можете использовать стандартный синтаксис UPDATE FROM SELECT для связанных серверов.

UPDATE 
   LinkedTable
SET 
   LinkedTable.Field1= 123
FROM
   (
        SELECT *  FROM OPENQUERY(STATION_TEST,'select * from deslocal.RFID_Prod WHERE valid = ''N''')   
   ) AS LinkedTable       
WHERE
    LinkedTable.Field2=456

Однако, если вы попытаетесь OUTPUT INSERTED войти в таблицу @Temp, как показано ниже:

DECLARE @Updated table(Field1 INT,Field2 INT)

WITH X AS(SELECT *  FROM OPENQUERY(STATION_TEST,'select * from deslocal.RFID_Prod WHERE valid = ''N'''))
UPDATE
  T
SET
  T.Field1 = 2212 
OUTPUT 
    INSERTED.Field2,INSERTED.Field2 
    INTO @Updated
FROM
    (SELECT * FROM X )AS T
WHERE 
    T.Field1=123

Оператор потерпит неудачу со следующим сообщением.

Удаленная таблица не может использоваться в качестве цели DML в операторе, который включает в себя предложение OUTPUT или вложенный оператор DML.

Обновление и выбор с использованием связанного сервера, по-видимому, требуют двух операторов.

Однако ..... возможно, вы сможете передать результаты OUTPUT INSERTED INTO в удаленную таблицу, но тогда это будет второй оператор для вызова набора результатов.

Еще два варианта

Добавьте ключ критического обновления в целевую таблицу.

ALTER deslocal ADD(CriticalCorrelationID UNIQUEIDENTIFIER)
..

DECLARE @CorrelationID UNIQUEIDENTIFIER = NEW_ID()


UPDATE 
    STATION_TEST.YourDatabaseName.dbo.deslocal 
SET 
    Valid='Y',
    CriticalCorrelationID=@CorrelationID 
WHERE
    Valid='N'

SELECT * FROM STATION_TEST.YourDatabaseName.dbo.deslocal 
WHERE CriticalCorrelationID=@CorrelationID 

Использовать распределенную транзакцию

BEGIN DISTRIBUTED TRANS
UPDATE STATION_TEST.YourDatabaseName.dbo.deslocal 
...
SELECT * FROM STATION_TEST.YourDatabaseName.dbo.deslocal WHERE
COMMIT TRANS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...