Effectuer une itération dans un jeu de résultats à l’aide de Transact-SQL dans SQL Server

Cet article décrit les différentes méthodes que vous pouvez utiliser pour effectuer une itération 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 initiale :   111401

Synthèse

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

Utiliser les instructions Transact-SQL pour effectuer une itération dans un jeu de résultats

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

L’une des méthodes est l’utilisation de tables Temp. Cette méthode vous permet de créer un instantané de l’instruction initiale et de l' SELECT utiliser 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<BR/>
end
set rowcount 0

Une deuxième méthode consiste à utiliser la min fonction pour remonter une ligne à la fois dans un tableau. Cette méthode permet de bloquer les nouvelles lignes 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 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

Notes

Les deux exemples 1 et 2 supposent qu’il existe un identificateur unique pour chaque ligne de la table source. Dans certains cas, il n’existe pas d’identificateur unique. Dans ce cas, vous pouvez modifier la méthode de la table TEMP 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

Références

ROW_NUMBER (Transact-SQL)