Een resultatenset herhalen 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.

Originele productversie: SQL Server
Origineel 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

Er zijn drie methoden die u kunt gebruiken om een resultatenset te herhalen met behulp van Transact-SQL-instructies.

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

Een tweede methode is om de min functie te gebruiken om een tabel rij voor rij te doorlopen. Met deze methode worden nieuwe rijen vastgelegd die zijn toegevoegd nadat de opgeslagen procedure is gestart, op voorwaarde dat de nieuwe rij een unieke id heeft die groter is dan de huidige rij die in de query wordt verwerkt. Bijvoorbeeld:

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

Opmerking

In zowel voorbeeld 1 als voorbeeld 2 wordt ervan uitgegaan dat er een unieke id bestaat voor elke rij in de brontabel. 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 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

Verwijzingen

ROW_NUMBER (Transact-SQL)