SQL Server 2005 擴充 `TOP` 支援 `UPDATE`/`DELETE` 並可參數化,但不支援直接 `ORDER BY`。若需依特定順序刪除/更新前 N 筆,可搭配 CTE(Common Table Expression)達成。
-- 參數化
DECLARE @n INT = 2;
UPDATE TOP (@n) tb SET tag = 1;
DELETE TOP (@n) FROM tb;
CREATE TABLE tb (id INT IDENTITY(1,1), name VARCHAR(10), tag INT DEFAULT 0);
INSERT INTO tb (name) VALUES ('a'),('b'),('c'),('d'),('e');
UPDATE TOP (2) tb SET tag = 1;
-- 結果:id 1,2 的 tag=1
;WITH t AS (SELECT TOP (2) * FROM tb ORDER BY id DESC)
UPDATE t SET tag = 1;
-- 結果:id 5,4 的 tag=1
DELETE TOP (2) FROM tb;
-- 結果:剩 id 3,4,5
;WITH t AS (SELECT TOP (2) * FROM tb ORDER BY id DESC)
DELETE FROM t;
-- 結果:剩 id 3
結合 `OUTPUT` 子句與 `UPDATE TOP (1)` 可實作高併發下的「獨占取號/任務領取」模式:
UPDATE TOP (1) tasks
SET status = 'PROCESSING', worker_id = @myId
OUTPUT inserted.task_id, inserted.payload
WHERE status = 'PENDING';
單一陳述式原子性完成「查詢+鎖定+回傳」,適合平行任務佇列。