sql-server - 如何使用 ORDER BY 更新 TOP(n) 给出可预测的结果?

标签 sql-server tsql 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;

唯一的问题是,根据 UPDATE (Transact-SQL) on MSDNORDER BYUPDATE 中无效,并且:

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/

相关文章:

尽管更新了统计数据,SQL Server 2016 的查询计划估计仍然不正确

sql - 什么操作类型在 SQL Server 2008 中调用了触发器?

php - Laravel 作业队列死锁与多个队列守护进程

c++ - 出队不适用于从双链表继承的队列类

c++ - 队列不添加对象 - C++ 11

sql - 使用具有特定条件的 LAG 获取上一行值

c# - 更新记录

mysql - 是否有单独的语言来查询 SQL Server 和 Oracle

sql-server - sql server中的OUTPUT子句有什么用

sql - SQL 查询返回同一个表两次内连接的双倍行