Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
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