Herhalen door een resultatenset met behulp van Transact-SQL in SQL Server

In dit artikel worden verschillende methoden beschreven die u kunt gebruiken om een resultatenset te doorlopen met behulp van Transact-SQL in SQL Server.

Oorspronkelijke productversie: SQL Server
Oorspronkelijk KB-nummer: 111401

Samenvatting

In dit artikel worden verschillende methoden beschreven die u kunt gebruiken om een cursorachtige FETCH-NEXT logica te simuleren in een opgeslagen procedure, trigger of Transact-SQL-batch.

Transact-SQL-instructies gebruiken om een resultatenset te doorlopen

Hier volgen drie methoden die u kunt gebruiken om een resultatenset te herhalen met behulp van Transact-SQL-instructies. In de onderstaande voorbeelden wordt de tabel Production.Product uit de AdventureWorks-voorbeelddatabase gebruikt

Eén methode is het gebruik van tijdelijke tabellen. Met deze methode maakt u een momentopname van de eerste SELECT instructie en gebruikt u deze als basis voor cursoring. Bijvoorbeeld:

/********** 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

Een tweede methode is het gebruik van de min functie om een tabel één rij tegelijk te doorlopen. Met deze methode worden nieuwe rijen onderschept die zijn toegevoegd nadat de opgeslagen procedure is gestart, mits de nieuwe rij een unieke id heeft die groter is dan de huidige rij die in de query wordt verwerkt. Bijvoorbeeld:

/********** 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

Notitie

In zowel voorbeeld 1 als 2 wordt ervan uitgegaan dat er voor elke rij in de brontabel een unieke id bestaat. In sommige gevallen bestaat er mogelijk geen unieke id. Als dat het geval is, kunt u de tijdelijke tabelmethode wijzigen om een zojuist gemaakte sleutelkolom te gebruiken. Bijvoorbeeld:

/********** 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

Verwijzingen

ROW_NUMBER (Transact-SQL)