Er det en måte å løkke gjennom en tabellvariabel i TSQL uten å bruke en markør?

La oss si at jeg har følgende enkle tabellvariabel:

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

Er å erklære og bruke en markør mitt eneste alternativ hvis jeg ønsket å iterere gjennom radene? Er det en annen måte?

Løsning

Først og fremst bør du være helt sikker på at du trenger å iterere gjennom hver rad - settbaserte operasjoner vil utføre raskere i alle tilfeller jeg kan tenke meg og vil normalt bruke enklere kode.

Avhengig av dataene dine kan det være mulig å løkke bare ved å bruke utvalgte utsagn som vist nedenfor:

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

Et annet alternativ er å bruke en midlertidig 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

Hvilket alternativ du bør velge, avhenger av strukturen og volumet på dataene dine.

Merk: Hvis du bruker SQL Server, vil du være bedre tjent med å bruke:

WHILE EXISTS(SELECT * FROM #Temp)

Ved å bruke COUNT må du berøre hver eneste rad i tabellen, EXISTS trenger bare å berøre den første (se Josefs svar nedenfor).

Kommentarer (7)

Slik ville jeg gjort det:


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 
Kommentarer (8)

Du kan bruke en while-sløyfe:

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

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