Resultados de la página

Completado

Una extensión de la cláusula ORDER BY denominada OFFSET-FETCH permite devolver solo un intervalo de las filas seleccionadas por la consulta. Agrega la capacidad de proporcionar un punto inicial (un desplazamiento) y un valor para especificar cuántas filas desea devolver (un valor de captura). Esta extensión proporciona una técnica práctica para paginar los resultados.

Si desea devolver filas una "página" a la vez (con el número que elija para una página), deberá tener en cuenta que cada consulta con una cláusula OFFSET-FETCH se ejecuta independientemente de cualquier otra consulta. No se mantiene ningún estado del lado servidor y deberá realizar un seguimiento de su posición mediante un conjunto de resultados a través del código del lado cliente.

Sintaxis de OFFSET-FETCH

La sintaxis de la cláusula OFFSET-FETCH, que técnicamente forma parte de la cláusula ORDER BY, es la siguiente:

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY]

Uso de OFFSET-FETCH

Para usar OFFSET-FETCH, debe proporcionar un valor OFFSET inicial, que puede ser cero, y un número opcional de filas que se devolverán, como en el ejemplo siguiente:

En este ejemplo se devolverán las 10 primeras filas y, luego, se devolverán las 10 filas siguientes de datos de producto en función de ListPrice:

SELECT ProductID, ProductName, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC 
OFFSET 0 ROWS --Skip zero rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10

Para recuperar la página siguiente de datos del producto, use la cláusula OFFSET para especificar el número de filas que se van a omitir:

SELECT ProductID, ProductName, ListPrice
FROM Production.Product
ORDER BY ListPrice DESC 
OFFSET 10 ROWS --Skip 10 rows
FETCH NEXT 10 ROWS ONLY; --Get the next 10

En la definición de sintaxis puede ver que la cláusula OFFSET es obligatoria, pero la cláusula FETCH no lo es. Si se omite la cláusula FETCH, se devolverán todas las filas siguientes a OFFSET. También encontrará que las palabras clave ROW y ROWS son intercambiables, al igual que FIRST y NEXT, lo que permite una sintaxis más natural.

Para garantizar la precisión de los resultados, especialmente cuando se mueve de página a página de datos, es importante construir una cláusula ORDER BY que proporcione una ordenación única y un resultado determinista. Debido a la forma en que funciona el optimizador de consultas de SQL Server, es técnicamente posible que una fila aparezca en más de una página, a menos que el intervalo de filas sea determinista.