Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server CTE-使用插入的输出在更新后选择_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

SQL Server CTE-使用插入的输出在更新后选择

SQL Server CTE-使用插入的输出在更新后选择,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我看到过一些关于使用CTE(WITH)的帖子,我认为这些帖子可以解决我的问题,但我似乎无法使其适用于我的特定用例。我的用例是,我有一个包含一系列记录的表,我需要在对它们进行一个小的更新之后提取一些记录 i、 e。 -检索满足一系列条件的记录 -更新每个记录中的一列或多列 -返回更新的记录 我知道我可以使用以下方法返回记录的ID: WITH cte AS ( SELECT TOP 1 * FROM msg WHERE guid = 'abcd' AND active = 1 O

我看到过一些关于使用CTE(WITH)的帖子,我认为这些帖子可以解决我的问题,但我似乎无法使其适用于我的特定用例。我的用例是,我有一个包含一系列记录的表,我需要在对它们进行一个小的更新之后提取一些记录

i、 e。 -检索满足一系列条件的记录 -更新每个记录中的一列或多列 -返回更新的记录

我知道我可以使用以下方法返回记录的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。

只需添加所需的所有列,即可选择所需的数据<代码>插入的包含所有列,而不仅仅是写入的列。您还可以从
cte
别名输出列。例如:

    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
OUTPUT INSERTED.SomeOtherColumn, cte.SomeOtherColumn

只需添加所需的所有列,即可选择所需的数据<代码>插入的包含所有列,而不仅仅是写入的列。您还可以从
cte
别名输出列。例如:

OUTPUT INSERTED.SomeOtherColumn, cte.SomeOtherColumn

有语法问题吗?Msg 102,15级,状态1,第4行“cte”附近语法不正确。Msg 156,15级,状态1,第8行关键字“ORDER”附近语法不正确。(仅供参考,行号可能已关闭,我添加了一个“use”语句以确保使用了正确的数据库,并保留了您的其他新行)这有什么作用?它选择相同的数据,只是使用了一个不必要的临时表。“不必要的”临时表允许海报在需要时使用连接语法中针对其他表的ID列表;给猫剥皮的不同方法。谢谢斯图尔特,也很有帮助。希望我能选择两个答案。有语法问题吗?Msg 102,15级,状态1,第4行“cte”附近语法不正确。Msg 156,15级,状态1,第8行关键字“ORDER”附近语法不正确。(仅供参考,行号可能已关闭,我添加了一个“use”语句以确保使用了正确的数据库,并保留了您的其他新行)这有什么作用?它选择相同的数据,只是使用了一个不必要的临时表。“不必要的”临时表允许海报在需要时使用连接语法中针对其他表的ID列表;给猫剥皮的不同方法。谢谢斯图尔特,也很有帮助。希望我能选择两个答案。使用插入的输出。*准确地为我做了。使用插入的输出。*准确地为我做了。