Partager via


Itérer dans un jeu de résultats à l’aide de Transact-SQL dans SQL Server

Cet article décrit différentes méthodes que vous pouvez utiliser pour itérer dans un jeu de résultats à l’aide de Transact-SQL dans SQL Server.

Version du produit d’origine : SQL Server
Numéro de la base de connaissances d’origine : 111401

Résumé

Cet article décrit différentes méthodes que vous pouvez utiliser pour simuler une logique de type curseur FETCH-NEXT dans une procédure stockée, un déclencheur ou un lot Transact-SQL.

Utiliser des instructions Transact-SQL pour itérer dans un jeu de résultats

Voici trois méthodes que vous pouvez utiliser pour itérer dans un jeu de résultats à l’aide d’instructions Transact-SQL. Les exemples ci-dessous utilisent la table Production.Product de l’exemple de base de données AdventureWorks

Une méthode est l’utilisation de tables temporaires. Avec cette méthode, vous créez un instantané de l’instruction initiale SELECT et utilisez-la comme base pour le curseur. Par exemple :

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

Une deuxième méthode consiste à utiliser la min fonction pour parcourir une table une ligne à la fois. Cette méthode intercepte les nouvelles lignes qui ont été ajoutées après l’exécution de la procédure stockée, à condition que la nouvelle ligne ait un identificateur unique supérieur à la ligne actuelle en cours de traitement dans la requête. Par exemple :

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

Note

L’exemple 1 et 2 supposent qu’un identificateur unique existe pour chaque ligne de la table source. Dans certains cas, aucun identificateur unique n’existe. Si c’est le cas, vous pouvez modifier la méthode de table temporaire pour utiliser une colonne clé nouvellement créée. Par exemple :

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