C'è un modo per fare un loop attraverso una variabile di tabella in TSQL senza usare un cursore?

Diciamo che ho la seguente tabella semplice variabile:

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

Dichiarare e usare un cursore è la mia unica opzione se volessi iterare attraverso le righe? C'è un altro modo?

Soluzione

Prima di tutto dovresti essere assolutamente sicuro che hai bisogno di iterare attraverso ogni riga - le operazioni basate su set saranno più veloci in ogni caso a cui posso pensare e normalmente useranno un codice più semplice.

A seconda dei vostri dati potrebbe essere possibile eseguire il loop solo usando le istruzioni select come mostrato di seguito:

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

Un'altra alternativa è usare una tabella temporanea:

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

L'opzione che dovresti scegliere dipende davvero dalla struttura e dal volume dei tuoi dati.

Nota: Se state usando SQL Server fareste meglio ad usare:

WHILE EXISTS(SELECT * FROM #Temp)

Usando COUNT dovrai toccare ogni singola riga della tabella, il EXISTS ha bisogno di toccare solo la prima (vedi Josef'risposta qui sotto).

Commentari (7)

Ecco come farei io:


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

Potete usare un ciclo while:

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

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