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).