带有ORDER BY的SQL UPDATE TOP?

时间:2013-10-25 08:01:07

标签: sql sql-server

我有以下查询:

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

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

据我所知,无法将ORDER BY添加到UPDATE语句中。还有其他想法吗?

3 个答案:

答案 0 :(得分:32)

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

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

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

答案 1 :(得分: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.*

答案 2 :(得分:-6)

正确的更新语法是

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]