Paginar datos en SQL Server

0
1766

Una de las cosas que podemos hacer cuando ya manejamos mucha información en nuestro sitio web, es paginar los datos para que no se hagan listas interminables de datos en una pantalla. Esta forma que se explica aquí es mí preferida, ya que solicita nada más el extracto de información que va a desplegar, de esta forma se ahorran recursos.

Aquí sólo explicaremos la parte de SQL Server, en otro artículo lo integraremos a un ejemplo con ASP.NET.

Para realizar esto vamos a necesitar una función y un procedimiento almacenado.

SQL Server - Error 3414 SQL Server – Error 3414, servicio no inicia - El error 3414 se produce generalmente cuando el motor de la base de datos SQL Server sufre algún evento…

Creamos la función

La función CantidadPaginas recibe dos valores, CantidadRegistros y RegistrosPagina. CantidadRegistros es la cantidad de registros que tiene la tabla, o el total de registros de información sin paginar. RegistrosPagina es la cantidad de registros por página. Como resultado esta función retorna la cantidad de páginas que supondría esta consulta. Excelente para hacer un DataPager (ejemplo: pags. 1.2.3.4.5)

CREATE FUNCTION [dbo].[CantidadPaginas](
@CantidadRegistros as decimal,
@RegistrosPagina as decimal
)

RETURNS int
AS
BEGIN

DECLARE @retorno as int
SET @retorno = @CantidadRegistros / @RegistrosPagina
IF ((@CantidadRegistros / @RegistrosPagina) > 1)
  BEGIN
    IF  ((@CantidadRegistros / @RegistrosPagina) % 2 > 0 )
      SET @retorno = @retorno + 1
  END
ELSE
  BEGIN
    IF (@retorno = 0 AND @CantidadRegistros > 0)
      SET @retorno = 1
  END

return @retorno

END

Creamos el procedimiento

El procedimiento almacenado dn_sp_ListaRecursosXPagina recibe dos valores, Registros y Pagina. Registros es la cantidad de registros por página, valor que después se le pasa a la función anterior. El valor Pagina es la página que se quiere solicitar, por ejemplo el bloque de recursos de la página 2.

CREATE PROCEDURE [dbo].[dn_sp_ListaRecursosXPagina](
@registros int,
@pagina int
)
AS
  SET NOCOUNT ON
BEGIN

WITH dn_recurso_temp AS
(
SELECT ROW_NUMBER() OVER (ORDER BY codigo_recurso DESC) AS 'RowNumber',
  codigo_recurso,
  nombre_recurso,
  archivo,
  autor,
  fecha 
FROM dn_recurso
)

SELECT * FROM dn_recurso_temp
WHERE RowNumber between (@pagina * @registros)-@registros+1 and (@pagina * @registros)
ORDER BY codigo_recurso DESC

DECLARE @cantidad int
SELECT @cantidad = count(codigo_recurso) FROM dn_recurso

SELECT dbo.CantidadPaginas(@cantidad,@registros) TotalPaginas

END

En el procedimiento almacenado primero se solicitan los datos que se van a filtrar, la consulta a la tabla con los datos correspondientes, y se le agrega la columna RowNumber. RowNumber es la clave en esta operación. Row Number se debe ordenar por el valor que nosotros queremos que sea el indicador al filtro de páginas, como se vayan a ordenar los datos en la página. Puede ser un entero, fecha o el que queramos. Estos datos quedan almacenados en una tabla temporal o virtual.

Una vez que tengamos los datos ordenados y con el número de línea, se filtra el bloque que queremos consultar. Es donde se puede ver el código similar a:

SELECT * FROM dn_recurso_temp
WHERE RowNumber between RegistroInicio and RegistroFin
ORDER BY codigo_recurso DESC

Luego se consulta la cantidad de páginas para retornar también este valor para poder hacer la paginación respectiva.

Dejar respuesta

Please enter your comment!
Please enter your name here