Recorrer en iteración un conjunto de resultados mediante Transact-SQL en SQL Server

En este artículo se describen varios métodos que puede usar para recorrer en iteración un conjunto de resultados mediante Transact-SQL en SQL Server.

Versión del producto original: SQL Server
Número de KB original: 111401

Resumen

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

Uso de instrucciones Transact-SQL para recorrer en iteración un conjunto de resultados

Hay tres métodos que puede usar para recorrer en iteración un conjunto de resultados mediante instrucciones Transact-SQL.

Un método es el uso de tablas temporales. Con este método, se crea una instantánea de la instrucción inicial SELECT y se usa como base para el cursor. Por ejemplo:

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

Un segundo método consiste en usar la min función para recorrer una tabla de una fila a la vez. Este método detecta las filas nuevas que se agregaron después de que el procedimiento almacenado comience la ejecución, siempre que la nueva fila tenga un identificador único mayor que 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 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

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 existir ningún identificador único. Si ese es el caso, puede modificar el método de tabla temporal para usar una columna de clave recién creada. Por ejemplo:

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

Referencias

ROW_NUMBER (Transact-SQL)