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

时间:2018-11-09 02:52:55

标签: mysql sql sql-server openquery

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

恐怕选择结果将与第一次选择不同。

1 个答案:

答案 0 :(得分:0)

您可以对链接的服务器使用标准的UPDATE FROM SELECT语法。

Highcharts.theme = {
    colors: ["#7cb5ec", "#f7a35c", "#90ee7e", "#7798BF", "#aaeeee", "#ff0066", "#eeaaee", "#55BF3B", "#DF5353", "#7798BF", "#aaeeee"],
    chart: {
        zoomType: 'x',
        backgroundColor: null,
        style: {
            fontFamily: "Dosis, sans-serif"
        }
    },
    title: {
        style: {
            fontSize: '16px',
            fontWeight: 'bold',
            textTransform: 'uppercase'
        }
    },
    tooltip: {
        borderWidth: 0,
        backgroundColor: 'rgba(219,219,216,0.8)',
        shadow: false
    },
    legend: {
        itemStyle: {
            fontWeight: 'bold',
            fontSize: '13px'
        }
    },
    xAxis: {
        gridLineWidth: 1,
        labels: {
            style: {
                fontSize: '12px'
            }
        }
    },
    yAxis: {
        minorTickInterval: 'auto',
        title: {
            style: {
                textTransform: 'uppercase'
            }
        },
        labels: {
            style: {
                fontSize: '12px'
            }
        }
    },
    plotOptions: {
        candlestick: {
            lineColor: '#404048'
        }
    },
    scrollbar: {
        enabled: true
    },
    // General
    background2: '#F0F0EA'
};

但是,如果您尝试将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 插入@Temp表,如下所示:

OUTPUT INSERTED

该语句将失败,并显示以下消息。

  

在包含OUTPUT子句或嵌套DML语句的语句中,不能将远程表用作DML目标。

使用链接服务器进行更新和选择似乎需要两个语句。

但是.....您也许可以将OUTPUT INSERTED IN结果插入到远程表中,但是那仍然是调用结果集的第二条语句。

还有两个选择

向目标表添加关键更新相关键。

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

使用分布式交易

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