Existe uma forma de percorrer uma variável da tabela em TSQL sem usar o cursor?

Digamos que eu tenho a seguinte variável simples da tabela:

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

Declarar e usar um cursor é a minha única opção se eu quisesse iterar através das linhas? Existe outra forma?

Solução

Em primeiro lugar, você deve ter certeza absoluta de que precisa iterar através de cada linha - as operações baseadas no conjunto serão mais rápidas em todos os casos que eu possa pensar e normalmente usarei um código mais simples.

Dependendo dos seus dados, pode ser possível fazer um loop usando apenas instruções selecionadas, como mostrado abaixo:

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

Outra alternativa é usar uma mesa temporária:

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

A opção que você deve escolher depende realmente da estrutura e do volume dos seus dados.

Nota: Se você estiver usando o SQL Server você seria melhor servido usando:

WHILE EXISTS(SELECT * FROM #Temp)

Utilizando COUNT terá que tocar cada linha da tabela, o EXISTS só precisa tocar na primeira (veja Josef's answer abaixo).

Comentários (7)

Aqui está como eu o faria:


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 
Comentários (8)

Você pode usar um loop de tempo:

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

    Delete From #TempTable Where x = x
End
Comentários (0)