Zuallererst sollten Sie sich absolut sicher sein, dass Sie jede Zeile durchlaufen müssen – mengenbasierte Operationen werden in jedem Fall schneller ausgeführt, der mir einfällt, und normalerweise einfacheren Code verwenden.
Abhängig von Ihren Daten kann es möglich sein, nur mit SELECT
zu loopen Anweisungen wie unten gezeigt:
Declare @Id int
While (Select Count(*) From ATable Where Processed = 0) > 0
Begin
Select Top 1 @Id = Id From ATable Where Processed = 0
--Do some processing here
Update ATable Set Processed = 1 Where Id = @Id
End
Eine weitere Alternative ist die Verwendung einer temporären Tabelle:
Select *
Into #Temp
From ATable
Declare @Id int
While (Select Count(*) From #Temp) > 0
Begin
Select Top 1 @Id = Id From #Temp
--Do some processing here
Delete #Temp Where Id = @Id
End
Welche Option Sie wählen sollten, hängt wirklich von der Struktur und dem Umfang Ihrer Daten ab.
Hinweis: Wenn Sie SQL Server verwenden, sind Sie besser bedient mit:
WHILE EXISTS(SELECT * FROM #Temp)
Mit COUNT
muss jede einzelne Zeile in der Tabelle berühren, die EXISTS
muss nur den ersten berühren (siehe Josefs Antwort unten).