我已经看过一些关于使用CTE(WITH)的帖子,我认为这些帖子可以解决我的问题,但我似乎无法使其适用于我的特定用例。我的用例是我有一个包含一系列记录的表,我需要在对它们进行小的更新后拉出一些记录。
即。 - 检索满足一系列条件的记录 - 更新每个记录中的一个或多个列 - 返回更新的记录
我知道我可以使用以下内容返回记录的ID:
WITH cte AS
( SELECT TOP 1 * FROM msg
WHERE guid = 'abcd'
AND active = 1
ORDER BY created DESC )
UPDATE cte SET active = 0
OUTPUT INSERTED.msg_id
WHERE guid = 'abcd'
很好地返回了msg_id字段。我尝试在SELECT * FROM msg WHERE msg_id IN ()
查询中包装所有内容,但它失败了。
有人有建议吗?供参考,使用SQL Server 2008 R2。
答案 0 :(得分:3)
CREATE TABLE #t (msg_id int)
;
WITH cte AS
( SELECT TOP 1 * FROM msg
WHERE guid = 'abcd'
AND active = 1
ORDER BY created DESC )
UPDATE cte SET active = 0
OUTPUT INSERTED.msg_id INTO #t
WHERE guid = 'abcd'
SELECT *
FROM #t
答案 1 :(得分:2)
只需添加所需的所有列,即可选择所需的数据。 INSERTED
包含所有列,而不仅仅是写入的列。您还可以从cte
别名输出列。例如:
OUTPUT INSERTED.SomeOtherColumn, cte.SomeOtherColumn