31

我有以下查询:

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

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

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

4

3 回答 3

46

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

;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 的事实,例如可更新视图。

于 2013-10-25T08:05:27.760 回答
18

您可以尝试子查询

  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.*
于 2013-10-25T08:04:50.870 回答
-9

更新的正确语法是

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
于 2013-10-25T08:03:43.230 回答