Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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