Is er een manier om door een tabelvariabele te lopen in TSQL zonder een cursor te gebruiken?

Laten we zeggen dat ik de volgende eenvoudige tabelvariabele heb:

declare @databases table
(
    DatabaseID    int,
    Name        varchar(15),   
    Server      varchar(15)
)
-- insert a bunch rows into @databases

Is het declareren en gebruiken van een cursor mijn enige optie als ik door de rijen wil itereren? Is er een andere manier?

Oplossing

Eerst en vooral moet je er absoluut zeker van zijn dat je elke rij moet itereren - set-gebaseerde operaties zullen sneller werken in elk geval dat ik kan bedenken en zullen normaal gezien eenvoudigere code gebruiken.

Afhankelijk van je gegevens kan het mogelijk zijn om te lussen door enkel gebruik te maken van select statements zoals hieronder getoond:

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

Een ander alternatief is het gebruik van een tijdelijke tabel:

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

Welke optie u moet kiezen, hangt echt af van de structuur en het volume van uw gegevens.

Note: Als u SQL Server gebruikt, kunt u beter gebruik maken van:

WHILE EXISTS(SELECT * FROM #Temp)

Het gebruik van COUNT zal elke rij in de tabel moeten aanraken, de EXISTS hoeft alleen de eerste aan te raken (zie Josef's antwoord hieronder).

Commentaren (7)

Hier is hoe ik het zou doen:


Select Identity(int, 1,1) AS PK, DatabaseID
Into   #T
From   @databases

Declare @maxPK int;Select @maxPK = MAX(PK) From #T
Declare @pk int;Set @pk = 1

While @pk 
Commentaren (8)

Je kunt een while-lus gebruiken:

While (Select Count(*) From #TempTable) > 0
Begin
    Insert Into @Databases...

    Delete From #TempTable Where x = x
End
Commentaren (0)