【问题标题】:How to select into temp table and update at once如何选择临时表并立即更新
【发布时间】:2018-11-09 02:52:55
【问题描述】:

我将 MySql 以STATION_TEST 链接到 Sql Server。 我想将以下选择结果输入临时表并更新。 选择查询:

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';

恐怕选择结果会和第一次选择不一样。

【问题讨论】:

  • @Used_By_Already 是的,它可以,但对于许多进程。还有其他方法吗?
  • 没有什么简单的想法,这是我最简单(也是最可靠)的建议。

标签: mysql sql sql-server openquery


【解决方案1】:

您可以对链接服务器使用标准的 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

【讨论】:

  • @Rosh Bush 那么我是如何得到临时表的?
  • 你不能。不支持。我没有尝试过,但是 OUTPUT INSERTED “可能”可以路由到您的链接服务器,但是,这仍然达不到您的目标。
  • 我添加了两个“可能”作为替代方案。
猜你喜欢
  • 1970-01-01
  • 2015-12-30
  • 2013-05-29
  • 2020-12-12
  • 2020-08-09
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 1970-01-01
相关资源
最近更新 更多