Prima di tutto dovresti essere assolutamente sicuro di dover scorrere ogni riga:le operazioni basate su set funzioneranno più velocemente in ogni caso che mi viene in mente e normalmente utilizzeranno un codice più semplice.
A seconda dei tuoi dati, potrebbe essere possibile eseguire il loop usando solo SELECT
dichiarazioni come mostrato di seguito:
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
Un'altra alternativa è utilizzare una tabella temporanea:
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'opzione che dovresti scegliere dipende davvero dalla struttura e dal volume dei tuoi dati.
Nota: Se stai usando SQL Server, ti servirebbe meglio usando:
WHILE EXISTS(SELECT * FROM #Temp)
Utilizzando COUNT
dovrà toccare ogni singola riga della tabella, il EXISTS
basta toccare il primo (vedi sotto la risposta di Josef).