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 BY在UPDATE和中无效:
与INSERT,UPDATE或DELETE一起使用的TOP表达式中引用的行不按任何顺序排列.
我如何实现我需要的更新队列顶部的项目同时选择它们?
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.这更快并且通常具有更理想的锁定行为.