Compartir a través de


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 al cursor en un procedimiento almacenado, desencadenador o lote de Transact-SQL.

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

Estos son tres métodos que puede usar para recorrer en iteración un conjunto de resultados mediante instrucciones Transact-SQL. En los ejemplos siguientes se usa la tabla Production.Product de la base de datos de ejemplo AdventureWorks.

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

/********** example 1 **********/
SET NOCOUNT ON
DROP TABLE IF EXISTS #MYTEMP 
DECLARE @ProductID int

SELECT * INTO #MYTEMP FROM Production.Product

SELECT TOP(1) @ProductID = ProductID FROM #MYTEMP

WHILE @@ROWCOUNT <> 0
BEGIN
    SELECT * FROM #MYTEMP WHERE ProductID = @ProductID
    DELETE FROM #MYTEMP WHERE ProductID = @ProductID
    SELECT TOP(1) @ProductID = ProductID FROM #MYTEMP
END

Un segundo método consiste en usar la min función para recorrer una tabla una fila a la vez. Este método detecta nuevas filas que se agregaron después de que el procedimiento almacenado inicie 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 **********/
SET NOCOUNT ON
DROP TABLE IF EXISTS #MYTEMP 
DECLARE @ProductID int

SELECT @ProductID = min( ProductID ) FROM Production.Product
WHILE @ProductID IS NOT NULL

BEGIN
    SELECT * FROM Production.Product WHERE ProductID = @ProductID
    SELECT @ProductID = min( ProductID ) FROM Production.Product WHERE ProductID > @ProductID
END

Nota:

En el ejemplo 1 y 2 se supone 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 NOCOUNT ON
DROP TABLE IF EXISTS #MYTEMP 

SELECT NULL AS mykey, * INTO #MYTEMP FROM Production.Product

UPDATE TOP(1) #MYTEMP SET mykey = 1

WHILE @@ROWCOUNT > 0
BEGIN
    SELECT * FROM #MYTEMP WHERE mykey = 1
    DELETE FROM #MYTEMP WHERE mykey = 1
    UPDATE TOP(1) #MYTEMP SET mykey = 1
END

Referencias

ROW_NUMBER (Transact-SQL)