我需要从要更新的表中选择一些值,然后立即更新它们。此外,我需要在表中为每个更新的记录插入一条新记录。要选择记录和更新,我使用的结构如
UPDATE TableA SET SomeField = 1 OUTPUT RecordID FROM TableA WHERE RecordID IN
(
SELECT TOP @Something RecordID FROM TableA
)
现在,对于插入部分,我想将UPDATE
语句包装到INSERT INTO SELECT
中,从而利用OUTPUT
子句。但是,当我这样做时,SQL会抱怨
INSERT INTO TableA SELECT ( RecordID , GETDATE() ) FROM
(
UPDATE TableA SET SomeField = 1 OUTPUT RecordID FROM TableA WHERE RecordID IN
(
SELECT TOP @Something RecordID FROM TableA
)
)
即使使用OUTPUT
子句,我也不能在一个语句中完成所有操作吗?
答案 0 :(得分:2)
UPDATE TableA SET SomeField = 1
OUTPUT inserted.RecordID, GETDATE() into TableA (RecordID , DT)
FROM TableA
WHERE RecordID IN
(
SELECT TOP @Something RecordID FROM TableA
)
只是不确定 - 您是否尝试再次插入更新的行?
答案 1 :(得分:0)
可以使用输出将更新的行从一个表插入到另一个表中: 但是,我无法使用您正在使用的语法。 请查看此link
答案 2 :(得分:0)
当然,你可以尝试这样的事情:
INSERT INTO TableA (RecordID, Value)
SELECT RecordID, GETDATE()
FROM OPENQUERY(
yourserver,
'UPDATE TableA
SET SomeField = 1
OUTPUT inserted.RecordID
WHERE RecordID IN (SELECT TOP (5) RecordID FROM TableA)'
)
但这种方法存在一些问题:
您需要创建链接服务器yourserver
。
“远程”查询不会非常迅速。
您很难用TOP (5)
替换TOP (@Something)
。实际上,您很可能必须将整个语句转换为动态查询。 (这是正确的,你必须将已经动态的UPDATE放在另一个动态查询中。)
我希望,在最后一期中,单一语句限制最终会被打破。
所以,相反,为什么不这样:
DECLARE @tmpRecords TABLE (RecordID int);
UPDATE TableA
SET SomeField = 1
OUTPUT inserted.RecordID INTO @tmpRecords (RecordID)
WHERE RecordID IN (SELECT TOP (@Something) RecordID FROM TableA);
INSERT INTO TableA (RecordID, SomeDateColumn)
SELECT RecordID, GETDATE()
FROM @tmpRecords;