Antes de tudo, você deve ter certeza absoluta de que precisa iterar em cada linha - as operações baseadas em conjunto serão executadas mais rapidamente em todos os casos que eu puder pensar e normalmente usarão um código mais simples.
Dependendo dos seus dados, pode ser possível fazer um loop usando apenas
SELECT
declarações como mostrado abaixo: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
Outra alternativa é usar uma tabela temporária:
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
A opção que você deve escolher realmente depende da estrutura e do volume de seus dados.
Observação: Se você estiver usando o SQL Server, seria melhor servido usando:
WHILE EXISTS(SELECT * FROM #Temp)
Usando
COUNT
terá que tocar em cada linha da tabela, o EXISTS
só precisa tocar no primeiro (veja a resposta de Josef abaixo).