Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Gibt es eine Möglichkeit, eine Tabellenvariable in TSQL zu durchlaufen, ohne einen Cursor zu verwenden?

Zuallererst sollten Sie sich absolut sicher sein, dass Sie jede Zeile durchlaufen müssen – mengenbasierte Operationen werden in jedem Fall schneller ausgeführt, der mir einfällt, und normalerweise einfacheren Code verwenden.

Abhängig von Ihren Daten kann es möglich sein, nur mit SELECT zu loopen Anweisungen wie unten gezeigt:

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

Eine weitere Alternative ist die Verwendung einer temporären Tabelle:

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

Welche Option Sie wählen sollten, hängt wirklich von der Struktur und dem Umfang Ihrer Daten ab.

Hinweis: Wenn Sie SQL Server verwenden, sind Sie besser bedient mit:

WHILE EXISTS(SELECT * FROM #Temp)

Mit COUNT muss jede einzelne Zeile in der Tabelle berühren, die EXISTS muss nur den ersten berühren (siehe Josefs Antwort unten).