Microsoft SQL Server
Paginación
Buscar..
Introducción
Sintaxis
- SELECCIONAR * DE TableName ORDENAR POR ID OFFSET 10 ROWS FETCH SIGUIENTE 10 ROWS SOLAMENTE;
Paginación usando ROW_NUMBER con una expresión de tabla común
La función ROW_NUMBER
puede asignar un número creciente a cada fila en un conjunto de resultados. Combinado con una expresión de tabla común que usa un operador BETWEEN
, es posible crear 'páginas' de conjuntos de resultados. Por ejemplo: la primera página contiene los resultados 1-10, la segunda página contiene los resultados 11-20, la tercera página contiene los resultados 21-30 y así sucesivamente.
WITH data
AS
(
SELECT ROW_NUMBER() OVER (ORDER BY name) AS row_id,
object_id,
name,
type,
create_date
FROM sys.objects
)
SELECT *
FROM data
WHERE row_id BETWEEN 41 AND 50
Nota: no es posible utilizar ROW_NUMBER
en una cláusula WHERE
como:
SELECT object_id,
name,
type,
create_date
FROM sys.objects
WHERE ROW_NUMBER() OVER (ORDER BY name) BETWEEN 41 AND 50
Aunque esto sería más conveniente, el servidor SQL devolverá el siguiente error en este caso:
Msg 4108, nivel 15, estado 1, línea 6
Las funciones de ventana solo pueden aparecer en las cláusulas SELECT u ORDER BY.
Paginación con OFFSET FETCH
La cláusula OFFSET FETCH
implementa la paginación de una manera más concisa. Con esto, es posible omitir las filas N1 (especificadas en OFFSET
) y devolver las siguientes filas N2 (especificadas en FETCH
):
SELECT *
FROM sys.objects
ORDER BY object_id
OFFSET 40 ROWS FETCH NEXT 10 ROWS ONLY
Se requiere la cláusula ORDER BY
para proporcionar resultados deterministas.
Paginaton con consulta interna.
En versiones anteriores de SQL Server, los desarrolladores tenían que usar la clasificación doble combinada con la palabra clave TOP
para devolver filas en una página:
SELECT TOP 10 *
FROM
(
SELECT
TOP 50 object_id,
name,
type,
create_date
FROM sys.objects
ORDER BY name ASC
) AS data
ORDER BY name DESC
La consulta interna devolverá las primeras 50 filas ordenadas por name
. Luego, la consulta externa revertirá el orden de estas 50 filas y seleccionará las 10 filas superiores (estas serán las últimas 10 filas en el grupo antes de la reversión).
Paginación en varias versiones de SQL Server
SQL Server 2012/2014
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 4
SELECT OrderId, ProductId
FROM OrderDetail
ORDER BY OrderId
OFFSET (@PageNumber - 1) * @RowsPerPage ROWS
FETCH NEXT @RowsPerPage ROWS ONLY
SQL Server 2005/2008 / R2
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 4
SELECT OrderId, ProductId
FROM (
SELECT OrderId, ProductId, ROW_NUMBER() OVER (ORDER BY OrderId) AS RowNum
FROM OrderDetail) AS OD
WHERE OD.RowNum BETWEEN ((@PageNumber - 1 ) * @RowsPerPage) + 1
AND @RowsPerPage * @PageNumber
SQL Server 2000
DECLARE @RowsPerPage INT = 10, @PageNumber INT = 4
SELECT OrderId, ProductId
FROM (SELECT TOP (@RowsPerPage) OrderId, ProductId
FROM (SELECT TOP ((@PageNumber)*@RowsPerPage) OrderId, ProductId
FROM OrderDetail
ORDER BY OrderId) AS OD
ORDER BY OrderId DESC) AS OD2
ORDER BY OrderId ASC
SQL Server 2012/2014 utilizando ORDER BY OFFSET y FETCH NEXT
Para obtener las siguientes 10 filas simplemente ejecuta esta consulta:
SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
Puntos clave a considerar cuando se usa:
-
ORDER BY
es obligatorio para usar la cláusulaOFFSET
yFETCH
. -
OFFSET
cláusulaOFFSET
es obligatoria conFETCH
. Nunca puedes usar,ORDER BY
...FETCH
. -
TOP
no se puede combinar conOFFSET
yFETCH
en la misma expresión de consulta.