带有ORDER BY的SQL UPDATE TOP?

Mar*_*cin 24 sql sql-server

我有以下查询:

UPDATE TOP (@MaxRecords) Messages 
SET    status = 'P' 
OUTPUT inserted.* 
FROM   Messages 
where Status = 'N'
and InsertDate >= GETDATE()
Run Code Online (Sandbox Code Playgroud)

在Messages表中有优先级列,我想首先选择高优先级消息.所以我需要一个ORDER BY.但是我不需要在更新运行之前对输出进行排序,而是对数据进行排序.

据我所知,不可能将ORDER BY添加到UPDATE语句中.还有其他想法吗?

Rom*_*kar 37

你可以使用公用表表达式:

;with cte as (
   select top (@MaxRecords)
       status
   from Messages 
   where Status = 'N' and InsertDate >= getdate()
   order by ...
)
update cte set
    status = 'P'
output inserted.*
Run Code Online (Sandbox Code Playgroud)

这个使用的事实是,在SQL Server中,可以更新cte,就像可更新视图一样.

  • @Simon_Weaver,是的,它是正确的。INSERTED 是列前缀,指定插入或更新操作添加的值。以 INSERTED 为前缀的列反映 UPDATE、INSERT 或 MERGE 语句完成之后但执行触发器之前的值。来源:https://learn.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql?view=sql-server-ver15 (2认同)

Upe*_*ari 15

您可以尝试子查询

  UPDATE Messages 
    SET    status = 'P' 
    WHERE MessageId IN (SELECT TOP (@MaxRecords) MessageId FROM Messages where Status = 'N' and InsertDate >= GETDATE() ORDER BY Priority)
output inserted.*
Run Code Online (Sandbox Code Playgroud)

  • @AugustoBarreto你可以使用`top 100%'来获取所有记录而不是虚拟数字. (2认同)