Durchlaufen eines Resultsets mithilfe von Transact-SQL in SQL Server

In diesem Artikel werden verschiedene Methoden beschrieben, mit denen Sie ein Resultset mithilfe von Transact-SQL in SQL Server durchlaufen können.

Ursprüngliche Produktversion: SQL Server
Ursprüngliche KB-Nummer: 111401

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 eines Resultsets

Es gibt drei Methoden, mit denen Sie ein Resultset 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 ursprünglichen SELECT Anweisung und verwenden sie als Grundlage für den Cursor. Zum Beispiel:

/********** example 1 **********/
DECLARE @au_id char( 11 )

SET rowcount 0
SELECT * INTO #mytemp FROM authors

SET rowcount 1

SELECT @au_id = au_id FROM #mytemp

WHILE @@rowcount <> 0

BEGIN
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
END
SET rowcount 0

Eine zweite Methode besteht darin, die min -Funktion zu verwenden, um eine Tabelle zeilenweise zu durchlaufen. Diese Methode fängt neue Zeilen ab, die hinzugefügt wurden, nachdem die ausführung der gespeicherten Prozedur begonnen hat, vorausgesetzt, dass die neue Zeile einen eindeutigen Bezeichner aufweist, der größer ist als die aktuelle Zeile, die in der Abfrage verarbeitet wird. Beispiel:

/********** example 2 **********/
DECLARE @au_id char( 11 )

SELECT @au_id = min( au_id ) FROM authors
WHILE @au_id IS NOT NULL

BEGIN
SELECT * FROM authors WHERE au_id = @au_id
SELECT @au_id = min( au_id ) FROM authors WHERE au_id > @au_id
END

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 ist möglicherweise kein eindeutiger Bezeichner vorhanden. In diesem Fall können Sie die temporäre Tabellenmethode so ändern, dass eine neu erstellte Schlüsselspalte verwendet wird. Zum Beispiel:

/********** example 3 **********/
SET rowcount 0
SELECT NULL mykey, * INTO #mytemp FROM authors

SET rowcount 1
UPDATE #mytemp SET mykey = 1

WHILE @@rowcount > 0
BEGIN
SET rowcount 0
SELECT * FROM #mytemp WHERE mykey = 1
DELETE #mytemp WHERE mykey = 1
SET rowcount 1
UPDATE #mytemp SET mykey = 1
END
SET rowcount 0

References

ROW_NUMBER (Transact-SQL)