Tout d'abord, vous devez être absolument sûr de devoir parcourir chaque ligne ; les opérations basées sur les ensembles s'exécuteront plus rapidement dans tous les cas auxquels je peux penser et utiliseront normalement un code plus simple.
En fonction de vos données, il peut être possible de boucler en utilisant simplement SELECT déclarations comme indiqué ci-dessous :
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
Une autre alternative consiste à utiliser une table temporaire :
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
L'option que vous devez choisir dépend vraiment de la structure et du volume de vos données.
Remarque : Si vous utilisez SQL Server, vous seriez mieux servi en utilisant :
WHILE EXISTS(SELECT * FROM #Temp)
Utiliser COUNT devra toucher chaque ligne du tableau, le EXISTS il suffit de toucher le premier (voir la réponse de Josef ci-dessous).