La paginación de conjuntos de resultados en el servidor siempre ha sido una necesidad muy demandada. Afortunadamente, SQL Server 2012 introduce las nuevas cláusulas OFFSET y FETCH de ORDER BY, con las cuales podremos paginar conjuntos de resultados de una forma realmente sencilla, de forma similar a como se realiza en otros motores de base de datos como MySQL (OFFSET y LIMIT).
En versiones anteriores de SQL Server podíamos paginar conjuntos de resultados utilizando ROW_NUMBER, ORDER BY y WHERE, e incluso TOP, ORDER BY y WHERE. La primera de estas dos aproximaciones, permite un acceso aleatorio, mientras que la segunda tan sólo permite un acceso secuencial.
Ahora, con SQL Server 2012 es mucho más fácil. Por ejemplo, supongamos que estamos paginando de 10 en 10. En este caso, para obtener la tercera página (de la fila 21 a la 30), podríamos ejecutar una consulta como la siguiente.
SELECT * FROM dbo.MiTabla ORDER BY ID OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
|
Por supuesto, no es requisito utilizar valores literales en las cláusulas OFFSET y NEXT, es decir, también podemos utilizar variables, lo cual nos permite parametrizar nuestra consulta y utilizarla en Procedimientos Almacenados (sin tener que recurrir al SQL Dinámico). A continuación se muestra una consulta SQL de ejemplo, parametrizada para utilizar el número de la página que deseamos obtener, así como el tamaño de cada página (número de filas por página).
SELECT * FROM dbo.MiTabla ORDER BY ID OFFSET (@NUM_PAGINA-1)*@TAM_PAGINA ROWS FETCH NEXT @TAM_PAGINA ROWS ONLY
|
No debemos olvidar, que además de poder paginar sobre un conjunto de resultados, deberemos ser capaces de conocer si estamos en la primera o en la última página, para poder ofrecer al usuario una experiencia de navegación congruente. La primera página es trivial, pero para poder conocer si estamos en la última página deberemos recurrir a un SELECT COUNT(*).
Por último, a continuación se puede descargar un ZIP con un código SQL de ejemplo, el cual, crea una tabla con datos de ejemplo y varios procedimientos almacenados, para poder practicar las diferentes formas de paginación, tanto utilizando OFFSET y FETCH, como utilizando otras aproximaciones disponibles en versiones anteriores de SQL Server.
Poco más por hoy. Como siempre, confío que la lectura resulte de interés.