Solución:
Finalmente, Microsoft SQL Server 2012 fue lanzado, realmente me gusta su simplicidad para una paginación, no tiene que usar consultas complejas como las que se responden aquí.
Para obtener las siguientes 10 filas, simplemente ejecute esta consulta:
SELECT * FROM TableName ORDER BY id OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY;
https://docs.microsoft.com/en-us/sql/t-sql/queries/select-order-by-clause-transact-sql#using-offset-and-fetch-to-limit-the-rows- regresó
Puntos clave a considerar al usarlo:
-
ORDER BY
es obligatorio de usarOFFSET ... FETCH
cláusula. -
OFFSET
la cláusula es obligatoria conFETCH
. No se puede utilizarORDER BY ...
.
FETCH -
TOP
no se puede combinar conOFFSET
yFETCH
en la misma expresión de consulta.
Obtener el número total de resultados y paginar son dos operaciones diferentes. Por el bien de este ejemplo, supongamos que la consulta con la que está tratando es
SELECT * FROM Orders WHERE OrderDate >= '1980-01-01' ORDER BY OrderDate
En este caso, determinaría el número total de resultados usando:
SELECT COUNT(*) FROM Orders WHERE OrderDate >= '1980-01-01'
… que puede parecer ineficiente, pero en realidad es bastante eficaz, asumiendo que todos los índices, etc.están configurados correctamente.
A continuación, para obtener los resultados reales de forma paginada, la siguiente consulta sería la más eficaz:
SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY OrderDate ) AS RowNum, *
FROM Orders
WHERE OrderDate >= '1980-01-01'
) AS RowConstrainedResult
WHERE RowNum >= 1
AND RowNum < 20
ORDER BY RowNum
Esto devolverá las filas 1-19 de la consulta original. Lo bueno aquí, especialmente para las aplicaciones web, es que no tiene que mantener ningún estado, excepto los números de fila que se devolverán.
Increíblemente, ninguna otra respuesta ha mencionado la lo más rápido forma de hacer la paginación en todas las versiones de SQL Server. Las compensaciones pueden ser terriblemente lentas para un gran número de páginas, como se compara aquí. Existe una forma completamente diferente y mucho más rápida de realizar la paginación en SQL. Esto a menudo se denomina “método de búsqueda” o “paginación de conjuntos de claves”, como se describe en esta publicación de blog aquí.
SELECT TOP 10 first_name, last_name, score, COUNT(*) OVER()
FROM players
WHERE (score < @previousScore)
OR (score = @previousScore AND player_id < @previousPlayerId)
ORDER BY score DESC, player_id DESC
El “predicado de búsqueda”
los @previousScore
y @previousPlayerId
Los valores son los valores respectivos del último registro de la página anterior. Esto le permite buscar la página “siguiente”. Si el ORDER BY
la dirección es ASC
, simplemente usa >
en lugar de.
Con el método anterior, no puede saltar inmediatamente a la página 4 sin haber obtenido primero los 40 registros anteriores. Pero a menudo, no querrás saltar tan lejos de todos modos. En cambio, obtiene una consulta mucho más rápida que podría obtener datos en un tiempo constante, dependiendo de su indexación. Además, sus páginas permanecen “estables”, sin importar si los datos subyacentes cambian (por ejemplo, en la página 1, mientras está en la página 4).
Esta es la mejor manera de implementar la paginación cuando se carga más datos en aplicaciones web, por ejemplo.
Tenga en cuenta que el “método de búsqueda” también se denomina paginación de conjuntos de claves.
Total de registros antes de la paginación
los COUNT(*) OVER()
La función de ventana le ayudará a contar el número total de registros “antes de la paginación”. Si está utilizando SQL Server 2000, tendrá que recurrir a dos consultas para el COUNT(*)
.