您可以对链接服务器使用标准的 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
语句将失败并显示以下消息。
在包含 OUTPUT 子句或嵌套 DML 语句的语句中,不能将远程表用作 DML 目标。
使用链接服务器更新和选择似乎需要两个语句。
但是......您可能能够将 OUTPUT INSERTED 的结果通过管道传输到远程表中,但是,调用结果集仍然是第二条语句。
另外两个选项
向目标表添加关键更新关联键。
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