Allereerst moet je er absoluut zeker van zijn dat je door elke rij moet itereren - op set gebaseerde bewerkingen zullen sneller werken in elk geval dat ik kan bedenken en zullen normaal gesproken eenvoudigere code gebruiken.
Afhankelijk van uw gegevens kan het mogelijk zijn om een lus te maken met alleen SELECT
verklaringen zoals hieronder getoond:
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
Een ander alternatief is om een tijdelijke tabel te gebruiken:
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
De optie die u moet kiezen, hangt echt af van de structuur en het volume van uw gegevens.
Opmerking: Als u SQL Server gebruikt, bent u beter van dienst met:
WHILE EXISTS(SELECT * FROM #Temp)
Gebruik COUNT
zal elke rij in de tabel moeten aanraken, de EXISTS
hoeft alleen de eerste aan te raken (zie Josefs antwoord hieronder).