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.
Leave a Reply