Först och främst bör du vara helt säker på att du behöver iterera genom varje rad — uppsättningsbaserade operationer kommer att fungera snabbare i alla fall jag kan tänka mig och kommer normalt att använda enklare kod.
Beroende på dina data kan det vara möjligt att loopa med bara SELECT
uttalanden som visas nedan:
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
Ett annat alternativ är att använda en tillfällig tabell:
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
Alternativet du bör välja beror verkligen på strukturen och volymen av dina data.
Obs! Om du använder SQL Server är det bättre att använda:
WHILE EXISTS(SELECT * FROM #Temp)
Använder COUNT
måste trycka på varje enskild rad i tabellen, koden EXISTS
behöver bara röra vid den första (se Josefs svar nedan).