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
謝謝。你能解釋一下ROWLOCK,READPAST屬性在這種情況下做了什麼?這也確保沒有其他服務器在被刪除之前也選擇相同的行嗎?我真的沒有看到選擇進入TEMP表的區別嗎? – Krumelur
@Krumelur - 'rowlock'應該從名稱中合理地解釋。 'readpast'意味着在併發的情況下,第二個事務不會被阻塞,等待第一個事務的鎖被釋放。有關更多詳細信息,請參見[使用表格作爲隊列:FIFO隊列部分](http://rusanu.com/2010/03/26/using-tables-as-queues/)。不知道你爲什麼在討論臨時表。這些與CTE完全不同。 CTE沒有物化到任何類型的臨時表中。 –
該鏈接是很好的解釋謝謝!但它也表明,如果沒有CTE(FIFO部分的最後一段),問題就可以解決。我是否正確理解替代版本更加昂貴,但對於併發性而言是安全的? – Krumelur