So wird es gemacht: Durchlaufen einer Ergebnismenge mithilfe von Transact-SQL in SQL Server


Zusammenfassung


In diesem Artikel werden verschiedene Methoden beschrieben, mit denen Sie eine Cursor ähnliche FETCH-NEXT-Logik in einer gespeicherten Prozedur, einem Trigger oder einem Transact-SQL-Batch simulieren können.

Verwenden von Transact-SQL-Anweisungen zum Durchlaufen einer Ergebnismenge

Es gibt drei Methoden, mit denen Sie eine Ergebnismenge mithilfe von Transact-SQL-Anweisungen durchlaufen können. Eine Methode ist die Verwendung von temporären Tabellen. Mit dieser Methode erstellen Sie eine "Momentaufnahme" der anfänglichen SELECT-Anweisung und verwenden Sie als Grundlage für "Cursoring". Beispiel:
/********** example 1 **********/ declare @au_id char( 11 )set rowcount 0select * into #mytemp from authorsset rowcount 1select @au_id = au_id from #mytempwhile @@rowcount <> 0begin    set rowcount 0    select * from #mytemp where au_id = @au_id    delete #mytemp where au_id = @au_id    set rowcount 1    select @au_id = au_id from #mytemp<BR/>endset rowcount 0
Eine zweite Methode ist die Verwendung der Funktion Min , um eine Tabelle jeweils um eine Zeile zu "durchlaufen". Diese Methode fängt neue Zeilen ab, die hinzugefügt wurden, nachdem die gespeicherte Prozedur die Ausführung begonnen hat, vorausgesetzt, die neue Zeile hat einen eindeutigen Bezeichner, der größer als die aktuelle Zeile ist, die in der Abfrage verarbeitet wird. Beispiel:
/********** example 2 **********/ declare @au_id char( 11 )select @au_id = min( au_id ) from authorswhile @au_id is not nullbegin    select * from authors where au_id = @au_id    select @au_id = min( au_id ) from authors where au_id > @au_idend
Hinweis: sowohl Beispiel 1 als auch 2 gehen davon aus, dass für jede Zeile in der Quelltabelle ein eindeutiger Bezeichner vorhanden ist. In einigen Fällen kann kein eindeutiger Bezeichner vorhanden sein. Wenn dies der Fall ist, können Sie die Temp -Tabellenmethode ändern, um eine neu erstellte Schlüsselspalte zu verwenden. Beispiel:
/********** example 3 **********/ set rowcount 0select NULL mykey, * into #mytemp from authorsset rowcount 1update #mytemp set mykey = 1while @@rowcount > 0begin    set rowcount 0    select * from #mytemp where mykey = 1    delete #mytemp where mykey = 1    set rowcount 1    update #mytemp set mykey = 1endset rowcount 0