Itérer au sein d’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 FETCH-NEXT curseur dans une procédure stockée, un déclencheur ou un lot Transact-SQL.

Utiliser des instructions Transact-SQL pour itérer au sein d’un jeu de résultats

Il existe trois méthodes que vous pouvez utiliser pour itérer dans un jeu de résultats à l’aide d’instructions Transact-SQL.

L’une des méthodes consiste à utiliser des tables temporaires. Avec cette méthode, vous créez un instantané de l’instruction initiale SELECT et vous l’utilisez comme base pour le curseur. Par exemple :

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

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 ajoutées après le début de 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 **********/
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

Remarque

Les exemples 1 et 2 supposent qu’il existe un identificateur unique 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 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

References

ROW_NUMBER (Transact-SQL)