我将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';
恐怕选择结果将与第一次选择不同。
答案 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