Como recorrer una tabla sin usar CURSORES – OFFSET FETCH

Por 0 No tags Permalink

Esta es otra forma de recorrer una tabla de SQL Server sin usar CURSORES.

Primero creamos una tabla con 20 registros para nuestro ejemplo.

DECLARE @RecorrerTabla TABLE (ID INT, DESCRIPCION VARCHAR(20))

INSERT INTO @RecorrerTabla
	SELECT 1,'REGISTRO 01' UNION ALL SELECT 2,'REGISTRO 02' UNION ALL SELECT 3,'REGISTRO 03' UNION ALL
	SELECT 4,'REGISTRO 04' UNION ALL SELECT 5,'REGISTRO 05' UNION ALL SELECT 6,'REGISTRO 06' UNION ALL
	SELECT 7,'REGISTRO 07' UNION ALL SELECT 8,'REGISTRO 08' UNION ALL SELECT 9,'REGISTRO 09' UNION ALL
	SELECT 10,'REGISTRO 10' UNION ALL SELECT 11,'REGISTRO 11' UNION ALL SELECT 12,'REGISTRO 12' UNION ALL 
	SELECT 13,'REGISTRO 13' UNION ALL SELECT 14,'REGISTRO 14' UNION ALL SELECT 15,'REGISTRO 15' UNION ALL 
	SELECT 16,'REGISTRO 16' UNION ALL SELECT 17,'REGISTRO 17' UNION ALL SELECT 18,'REGISTRO 18' UNION ALL 
	SELECT 19,'REGISTRO 19' UNION ALL SELECT 20,'REGISTRO 20'

SELECT * FROM @RecorrerTabla

Una vez tenemos la tabla vamos a recorrerla

DECLARE @RecorrerTabla TABLE (ID INT, DESCRIPCION VARCHAR(20))

INSERT INTO @RecorrerTabla
	SELECT 1,'REGISTRO 01' UNION ALL SELECT 2,'REGISTRO 02' UNION ALL SELECT 3,'REGISTRO 03' UNION ALL
	SELECT 4,'REGISTRO 04' UNION ALL SELECT 5,'REGISTRO 05' UNION ALL SELECT 6,'REGISTRO 06' UNION ALL
	SELECT 7,'REGISTRO 07' UNION ALL SELECT 8,'REGISTRO 08' UNION ALL SELECT 9,'REGISTRO 09' UNION ALL
	SELECT 10,'REGISTRO 10' UNION ALL SELECT 11,'REGISTRO 11' UNION ALL SELECT 12,'REGISTRO 12' UNION ALL 
	SELECT 13,'REGISTRO 13' UNION ALL SELECT 14,'REGISTRO 14' UNION ALL SELECT 15,'REGISTRO 15' UNION ALL 
	SELECT 16,'REGISTRO 16' UNION ALL SELECT 17,'REGISTRO 17' UNION ALL SELECT 18,'REGISTRO 18' UNION ALL 
	SELECT 19,'REGISTRO 19' UNION ALL SELECT 20,'REGISTRO 20'
	
DECLARE @I INT = 0
DECLARE @TotalRegistros INT = (SELECT COUNT(*) FROM @RecorrerTabla)
DECLARE @Descripcion VARCHAR(20) = ''

WHILE @I < @TotalRegistros
BEGIN
	SET @Descripcion = (SELECT DESCRIPCION FROM @RecorrerTabla 
						ORDER BY ID
						OFFSET @I ROWS
						FETCH NEXT 1 ROWS ONLY)
	PRINT 'PRINT: ' + @Descripcion
	SET @I += 1
END

Como vemos en la imagen, se imprime el campo descripción

¿Como crear un limit/offset en sql server?

Es muy fácil el uso de esta instrucción:

Con offset indicas el corrimiento de filas en el que inicia tu página actual.
Con fetcn next X rows only indicas el tamaño de la página.

DECLARE @RecorrerTabla TABLE (ID INT, DESCRIPCION VARCHAR(20))

INSERT INTO @RecorrerTabla
	SELECT 1,'REGISTRO 01' UNION ALL SELECT 2,'REGISTRO 02' UNION ALL SELECT 3,'REGISTRO 03' UNION ALL
	SELECT 4,'REGISTRO 04' UNION ALL SELECT 5,'REGISTRO 05' UNION ALL SELECT 6,'REGISTRO 06' UNION ALL
	SELECT 7,'REGISTRO 07' UNION ALL SELECT 8,'REGISTRO 08' UNION ALL SELECT 9,'REGISTRO 09' UNION ALL
	SELECT 10,'REGISTRO 10' UNION ALL SELECT 11,'REGISTRO 11' UNION ALL SELECT 12,'REGISTRO 12' UNION ALL 
	SELECT 13,'REGISTRO 13' UNION ALL SELECT 14,'REGISTRO 14' UNION ALL SELECT 15,'REGISTRO 15' UNION ALL 
	SELECT 16,'REGISTRO 16' UNION ALL SELECT 17,'REGISTRO 17' UNION ALL SELECT 18,'REGISTRO 18' UNION ALL 
	SELECT 19,'REGISTRO 19' UNION ALL SELECT 20,'REGISTRO 20'

SELECT * FROM @RecorrerTabla

SELECT DESCRIPCION FROM @RecorrerTabla 
						ORDER BY ID
						OFFSET 10 ROWS
						FETCH NEXT 5 ROWS ONLY

En este ejemplo se obtienen los registros del 11 al 15 con un solo SELECT

Este artículo se ha explicado el uso de la funcionalidad OFFSET FETCH para recuperar un registro con memoria limitada y evitar una excepción de falta de memoria. Las cláusulas FETCH y OFFSET en SQL Server se usan en combinación con las cláusulas SELECT y ORDER BY para limitar el rango de registros devueltos por la consulta. Se introdujo por primera vez con la versión 2012 de SQL Server para realizar la paginación del conjunto de resultados.

Compara el precio para envíos nacionales e internacionales con hasta un 70% de ahorro.

No Comments Yet.

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *