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


Résumé


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

Utiliser des instructions Transact-SQL pour itérer dans 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 . Cette méthode vous permet de créer un instantané de l’instruction SELECT initiale et de l’utiliser comme base pour le « pointeur ». Par exemple :
/********** example 1 **********/ declare @au_id char( 11 )set rowcount 0select * into #mytemp from authorsset rowcount 1select @au_id = au_id from #mytempwhile @@rowcount <> 0begin    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/>endset rowcount 0
Une deuxième méthode consiste à utiliser la fonction min pour « remonter » une table une ligne à la fois. Cette méthode intercepte les nouvelles lignes ajoutées après l’exécution de la procédure stockée, à condition que la nouvelle ligne dispose d’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 authorswhile @au_id is not nullbegin    select * from authors where au_id = @au_id    select @au_id = min( au_id ) from authors where au_id > @au_idend
Remarque: les deux exemples 1 et 2 présupposent qu’il existe un identificateur unique pour chaque ligne de la table source. Dans certains cas, il est possible qu’il n’existe aucun identificateur unique. Si tel est le cas, vous pouvez modifier la méthode de la table temporaire pour utiliser une nouvelle colonne clé créée. Par exemple :
/********** example 3 **********/ set rowcount 0select NULL mykey, * into #mytemp from authorsset rowcount 1update #mytemp set mykey = 1while @@rowcount > 0begin    set rowcount 0    select * from #mytemp where mykey = 1    delete #mytemp where mykey = 1    set rowcount 1    update #mytemp set mykey = 1endset rowcount 0