Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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