SQL Server CTE - 使用OUTPUT INSERTED UPDATE后的SELECT

时间:2014-04-15 16:38:02

标签: sql sql-server sql-server-2008-r2

我已经看过一些关于使用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。

2 个答案:

答案 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