Freigeben über


Durchlaufen eines Resultsets mithilfe von Transact-SQL in SQL Server

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

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

Übersicht

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

Hier sind drei Methoden, mit denen Sie ein Resultset durchlaufen können, indem Sie Transact-SQL-Anweisungen verwenden. In den folgenden Beispielen wird die Tabelle "Production.Product" aus der AdventureWorks-Beispieldatenbank verwendet.

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 die Cursorerstellung. Zum Beispiel:

/********** example 1 **********/
SET NOCOUNT ON
DROP TABLE IF EXISTS #MYTEMP 
DECLARE @ProductID int

SELECT * INTO #MYTEMP FROM Production.Product

SELECT TOP(1) @ProductID = ProductID FROM #MYTEMP

WHILE @@ROWCOUNT <> 0
BEGIN
    SELECT * FROM #MYTEMP WHERE ProductID = @ProductID
    DELETE FROM #MYTEMP WHERE ProductID = @ProductID
    SELECT TOP(1) @ProductID = ProductID FROM #MYTEMP
END

Eine zweite Methode besteht darin, die min Funktion zu verwenden, um jeweils eine Tabelle in einer Zeile zu durchlaufen. Diese Methode fängt neue Zeilen auf, die hinzugefügt wurden, nachdem die gespeicherte Prozedur ausgeführt wurde, vorausgesetzt, die neue Zeile hat einen eindeutigen Bezeichner größer als die aktuelle Zeile, die in der Abfrage verarbeitet wird. Zum Beispiel:

/********** example 2 **********/
SET NOCOUNT ON
DROP TABLE IF EXISTS #MYTEMP 
DECLARE @ProductID int

SELECT @ProductID = min( ProductID ) FROM Production.Product
WHILE @ProductID IS NOT NULL

BEGIN
    SELECT * FROM Production.Product WHERE ProductID = @ProductID
    SELECT @ProductID = min( ProductID ) FROM Production.Product WHERE ProductID > @ProductID
END

Notiz

Sowohl in Beispiel 1 als auch in 2 wird davon ausgegangen, dass für jede Zeile in der Quelltabelle ein eindeutiger Bezeichner vorhanden ist. In einigen Fällen ist möglicherweise kein eindeutiger Bezeichner vorhanden. Wenn dies der Fall ist, können Sie die temporäre Tabellenmethode so ändern, dass eine neu erstellte Schlüsselspalte verwendet wird. Zum Beispiel:

/********** example 3 **********/
SET NOCOUNT ON
DROP TABLE IF EXISTS #MYTEMP 

SELECT NULL AS mykey, * INTO #MYTEMP FROM Production.Product

UPDATE TOP(1) #MYTEMP SET mykey = 1

WHILE @@ROWCOUNT > 0
BEGIN
    SELECT * FROM #MYTEMP WHERE mykey = 1
    DELETE FROM #MYTEMP WHERE mykey = 1
    UPDATE TOP(1) #MYTEMP SET mykey = 1
END

References

ROW_NUMBER (Transact-SQL)