我有以下查询:
UPDATE TOP (@MaxRecords) Messages
SET status = 'P'
OUTPUT inserted.*
FROM Messages
where Status = 'N'
and InsertDate >= GETDATE()
在Messages表中有优先级列,我想先选择高优先级消息。所以我需要一个ORDER BY。但是我不需要在更新运行之前对输出进行排序,而是排序数据。
据我所知,无法将ORDER BY添加到UPDATE语句中。还有其他想法吗?
答案 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]