En primer lugar, debe estar absolutamente seguro de que necesita iterar a través de cada fila:las operaciones basadas en conjuntos funcionarán más rápido en todos los casos que se me ocurran y normalmente usarán un código más simple.
Dependiendo de sus datos, puede ser posible hacer un bucle usando solo SELECT
declaraciones como se muestra a continuación:
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
Otra alternativa es usar una tabla temporal:
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
La opción que debe elegir realmente depende de la estructura y el volumen de sus datos.
WHILE EXISTS(SELECT * FROM #Temp)
Usando COUNT
tendrá que tocar cada fila de la tabla, el EXISTS
solo necesita tocar el primero (vea la respuesta de Josef a continuación).