如何通过ORDER更新TOP(n)给出可预测的结果?

Mar*_*own 1 t-sql sql-server queue sql-server-2014

我正在尝试读取像队列一样使用的数据库表的前100项.当我这样做时,我试图将这些项目标记为:

UPDATE TOP(@qty)
    QueueTable WITH (READPAST)  
SET 
    IsDone = 1
OUTPUT
    inserted.Id,
    inserted.Etc
FROM
    QueueTable 
WHERE
    IsDone = 0
ORDER BY
    CreatedDate ASC;
Run Code Online (Sandbox Code Playgroud)

唯一的问题是,根据MSDN上的UPDATE(Transact-SQL),它ORDER BYUPDATE和中无效:

与INSERT,UPDATE或DELETE一起使用的TOP表达式中引用的行不按任何顺序排列.

我如何实现我需要的更新队列顶部的项目同时选择它们?

usr*_*usr 5

SQL Server允许您更新派生表,CTE或视图:

UPDATE x
SET 
    IsDone = 1
OUTPUT
    inserted.Id,
    inserted.Etc
FROM (
select TOP (N) *
FROM
    QueueTable 
WHERE
    IsDone = 0
ORDER BY
    CreatedDate ASC;
) x
Run Code Online (Sandbox Code Playgroud)

无需先计算一组ID.这更快并且通常具有更理想的锁定行为.

  • 这是可能的.OP似乎已经这样做了.任何表达都有效. (2认同)
  • 您可以选择顶部(@var)...请注意括号是必需的. (2认同)