Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
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