TSQL'de imleç kullanmadan bir tablo değişkeni üzerinde döngü yapmanın bir yolu var mı?

Diyelim ki aşağıdaki basit tablo değişkenine sahibim:

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

Satırlar arasında yineleme yapmak istersem tek seçeneğim bir imleç bildirmek ve kullanmak mıdır? Başka bir yolu var mı?

Çözüm

Öncelikle her satırda yineleme yapmanız gerektiğinden kesinlikle emin olmalısınız - küme tabanlı işlemler aklıma gelen her durumda daha hızlı çalışacak ve normalde daha basit kod kullanacaktır.

Verilerinize bağlı olarak, aşağıda gösterildiği gibi sadece select deyimlerini kullanarak döngü oluşturmak mümkün olabilir:

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

Başka bir alternatif de geçici bir tablo kullanmaktır:

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

Seçmeniz gereken seçenek gerçekten de verilerinizin yapısına ve hacmine bağlıdır.

Not: SQL Server kullanıyorsanız, şunları kullanmanız daha iyi olur:

WHILE EXISTS(SELECT * FROM #Temp)

COUNTkullanımı tablodaki her bir satıra dokunmak zorunda kalacaktır,EXISTS` sadece ilk satıra dokunmalıdır (aşağıdaki Josef'in cevabına bakın).

Yorumlar (7)

Ben olsam şöyle yapardım:


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

Bir while döngüsü kullanabilirsiniz:

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

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