2011-12-05 21 views
3

我使用下面的查詢從我的表中獲取特定類型的下一個項目。 我選擇了這種查詢格式,以防止幾個服務器嘗試獲取下一個項目時的競速狀況。 問題:我如何獲得dtmLastRunDate最低的項目?我試圖添加一個「ORDER BY dtmLastRunDate」,但它給了我「在關鍵字'ORDER'附近有不正確的語法」。如何使用DELETE FROM與OUTPUT結合使用時指定ORDER BY?

DELETE TOP(1) FROM Schedule 
WITH (READPAST) 
OUTPUT DELETED.intUserID, DELETED.dtmLastRunDate 
WHERE intScheduleType = @intScheduleType 

回答

5

將它放入如下的CTE中。

;WITH T 
    AS (SELECT TOP(1) * 
     FROM Schedule WITH (ROWLOCK, READPAST) 
     WHERE intScheduleType = @intScheduleType 
     ORDER BY dtmLastRunDate) 
DELETE FROM T 
OUTPUT DELETED.intUserID, 
     DELETED.dtmLastRunDate 
+0

謝謝。你能解釋一下ROWLOCK,READPAST屬性在這種情況下做了什麼?這也確保沒有其他服務器在被刪除之前也選擇相同的行嗎?我真的沒有看到選擇進入TEMP表的區別嗎? – Krumelur

+0

@Krumelur - 'rowlock'應該從名稱中合理地解釋。 'readpast'意味着在併發的情況下,第二個事務不會被阻塞,等待第一個事務的鎖被釋放。有關更多詳細信息,請參見[使用表格作爲隊列:FIFO隊列部分](http://rusanu.com/2010/03/26/using-tables-as-queues/)。不知道你爲什麼在討論臨時表。這些與CTE完全不同。 CTE沒有物化到任何類型的臨時表中。 –

+0

該鏈接是很好的解釋謝謝!但它也表明,如果沒有CTE(FIFO部分的最後一段),問題就可以解決。我是否正確理解替代版本更加昂貴,但對於併發性而言是安全的? – Krumelur