Вы можете использовать стандартный синтаксис 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