Problema:
Describir los diferentes métodos que se pueden usar para simular la lógica iterativa de un cursor en un procedimiento almacenado (stored procedure), disparador (trigger) o lote (batch) de T-SQL.
Solución:
Existen tres métodos para iterar a través de un conjunto de resultados utilizando sentencias Transact-SQL.
Un método es el uso de tablas temporales. Con este método, usted crea una “instantánea” (snapshot) de la sentencia SELECT inicial y utilizar esta como base sobre la cual iterar. Por ejemplo:
/********** ejemplo 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
GO
Un segundo método es utilizar la función min para caminar una tabla una fila a la vez. Este método toma en cuenta las filas que se agregan después de la ejecución del procedimiento almacenado empieza, si la fila nueva posee un identificador único mayor que el de la fila que se está siendo procesada en dicho momento por la consulta. Por ejemplo:
/********** ejemplo 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
GO
NOTA: ambos ejemplos 1 y 2 asumen que una columna de identificador único existe para cada fila en la tabla fuente. En algunos casos, dicho identificador no existe. Si ese es el caso, usted puede modificar el método de tabla temporal para usar una columna identificadora nueva. Por ejemplo:
/********** ejemplo 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
GO
Referencias:
How to iterate through a result set by using Transact-SQL in SQL Server