Bearbeiten:
Ich habe gegoogelt, um meine Antwort zu überprüfen:"Verarbeitung von Datenwarteschlangen in SQL Server mit READPAST und UPDLOCK". Es ist Jahre her, seit ich über diese Lösung gelesen und damit gespielt habe.
Original:
Wenn Sie den READPAST-Hinweis verwenden, werden gesperrte Zeilen übersprungen. Sie haben ROWLOCK verwendet, daher sollten Sie eine Sperreneskalation vermeiden. UPDLOCK braucht man auch, wie ich herausgefunden habe.
Prozess 1 sperrt also 20 Zeilen, Prozess 2 nimmt die nächsten 20, Prozess 3 nimmt Zeilen 41 bis 60 usw.
Das Update kann auch so geschrieben werden:
UPDATE TOP (20)
foo
SET
ProcessorID = @PROCID
FROM
OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK)
WHERE
ProcessorID = 0
Aktualisieren, Oktober 2011
Eleganter geht das mit der OUTPUT-Klausel, wenn man ein SELECT und ein UPDATE auf einmal braucht.