Przede wszystkim powinieneś być absolutnie pewien, że musisz iterować przez każdy wiersz — operacje oparte na zestawach będą działać szybciej w każdym przypadku, o którym myślę, i zwykle używam prostszego kodu.
W zależności od danych może być możliwe zapętlenie za pomocą tylko SELECT
oświadczenia, jak pokazano poniżej:
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
Inną alternatywą jest użycie tabeli tymczasowej:
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
Opcja, którą powinieneś wybrać, naprawdę zależy od struktury i objętości Twoich danych.
Uwaga: Jeśli korzystasz z SQL Server, lepiej będzie, jeśli użyjesz:
WHILE EXISTS(SELECT * FROM #Temp)
Używam COUNT
będzie musiał dotknąć każdego wiersza w tabeli, EXISTS
wystarczy dotknąć pierwszego (patrz odpowiedź Josefa poniżej).