我正在尝试读取像队列一样使用的数据库表的前 100 项。当我这样做时,我试图将这些项目标记为这样:
UPDATE TOP(@qty)
QueueTable WITH (READPAST)
SET
IsDone = 1
OUTPUT
inserted.Id,
inserted.Etc
FROM
QueueTable
WHERE
IsDone = 0
ORDER BY
CreatedDate ASC;
唯一的问题是,根据 UPDATE (Transact-SQL) on MSDN ,ORDER BY
在 UPDATE
中无效,并且:
The rows referenced in the TOP expression used with INSERT, UPDATE, or DELETE are not arranged in any order.
如何实现我所需要的,即在选择队列顶部的项目的同时更新它们?
最佳答案
SQL Server 允许您更新派生表、CTE 或 View :
UPDATE x
SET
IsDone = 1
OUTPUT
inserted.Id,
inserted.Etc
FROM (
select TOP (N) *
FROM
QueueTable
WHERE
IsDone = 0
ORDER BY
CreatedDate ASC;
) x
无需先计算一组 ID。这更快,并且通常具有更理想的锁定行为。
关于sql-server - 如何使用 ORDER BY 更新 TOP(n) 给出可预测的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40661061/