Прежде всего, вы должны быть абсолютно уверены, что вам нужно перебирать каждую строку - операции на основе набора будут выполняться быстрее в каждом случае, о котором я могу подумать, и обычно будут использовать более простой код.
В зависимости от ваших данных может быть возможно выполнить цикл, просто используя операторы выбора, как показано ниже:
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
Другая альтернатива - использовать временную таблицу:
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
Выбор, который вы должны выбрать, действительно зависит от структуры и объема ваших данных.
Примечание: Если вы используете SQL Server, вам лучше использовать:
WHILE EXISTS(SELECT * FROM #Temp)
Использование COUNT
должно касаться каждой строки в таблице, EXISTS
- только первой (см. ответ Иосифа ниже).