如何选择临时表并立即更新

kx5bkwkv  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(303)

我有mysql链接到sql server作为 STATION_TEST . 我想将以下选择结果输入临时表并更新。选择查询:

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

我无法选择两次进行更新,因为表rfid\u prod record每次都在运行。如果我这样问:

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

恐怕评选结果与第一次评选结果不一样。

kr98yfug

kr98yfug1#

可以对链接服务器使用标准的“从选择更新”语法。

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目标。
使用链接服务器更新和选择似乎需要两条语句。
但是…..您可以通过管道将插入到远程表中的输出结果传递给其他人,但是这样,调用结果集仍然是第二条语句。
还有两个选择
向目标表添加关键更新相关键。

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

相关问题