Cómo recorrer en iteración un conjunto de resultados con Transact-SQL en SQL Server


Resumen


En este artículo se describen varios métodos que puede usar para simular una lógica de FETCH-NEXT en un procedimiento almacenado, un desencadenador o un lote de Transact-SQL.

Usar instrucciones Transact-SQL para iterar por un conjunto de resultados

Hay tres métodos que puede usar para iterar por un conjunto de resultados mediante el uso de instrucciones Transact-SQL. Un método es el uso de tablas temporales . Con este método, creará una "instantánea" de la instrucción SELECT inicial y la usará como base para "cursor". Por ejemplo:
/********** 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
Un segundo método es usar la función min para "recorrer" una tabla de una en una. Este método detecta las nuevas filas que se agregaron después de que el procedimiento almacenado comienza a ejecutarse, siempre que la nueva fila tenga un identificador único mayor que el de la fila actual que se está procesando en la consulta. Por ejemplo:
/********** 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
Nota: tanto el ejemplo 1 como el 2 suponen que existe un identificador único para cada fila de la tabla de origen. En algunos casos, no puede haber un identificador único. En ese caso, puede modificar el método de tabla temporal para usar una columna de clave recién creada. Por ejemplo:
/********** 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