Buscar..


Introducción

Desplazamiento de fila y paginación en varias versiones de SQL Server

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

SQL Server 2008

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

SQL Server 2012

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áusula OFFSET y FETCH .
  • OFFSET cláusula OFFSET es obligatoria con FETCH . Nunca puedes usar, ORDER BY ... FETCH .
  • TOP no se puede combinar con OFFSET y FETCH en la misma expresión de consulta.


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow