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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für