Utilizar paginación en ASP.NET con SQL Server

Un problema que nos encontramos a la hora de realizar consultas con paginación esta en como rellenar un datatable con los registros necesarios de cada página. Es decir, no existe una manera fácil de realizar una consulta del tipo “devuélveme los registros 15 al 30 de la tabla usuarios“.

En MySQL existe un comando para utilizar en la sentencia SELECT que es LIMIT m,n gracias al cual podemos solicitar al servidor ‘n‘ registros comenzado desde el registro ‘m‘.

Para realizar este mismo proceso en SQL Server, podemos utilizar ROW_NUMBER() con un poco de ingenio. Por ejemplo, necesitamos obtener 10 registros desde el 30 al 40, en la siguiente consulta:

SELECT a.NOMBRE, a.TIPO, a.FECNAC,
a.APELLIDO1, a.COD_POSTAL, b.COD_NOMBRE
FROM usuarios AS a
INNER JOIN codpostal AS b ON a.COD_POSTAL = b.COD_POSTAL
WHERE a.FECNAC BETWEEN ? AND ? AND a.TIPO = ?
ORDER BY a.APELLIDO1

Para realizarlo, los haríamos de la siguiente forma:

SELECT *
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY a.NOMBRE) AS num,
a.NOMBRE, a.TIPO, a.FECNAC,
a.APELLIDO1, a.COD_POSTAL, b.COD_NOMBRE
FROM usuarios AS a
INNER JOIN codpostal AS b ON a.COD_POSTAL = b.COD_POSTAL
WHERE a.FECNAC BETWEEN ? AND ? AND a.TIPO = ?
) AS sub
WHERE (num >= 30 AND num <= 40)

En caso de no necesitar ordenar por ningún campo en concreto, podemos utilizar:

ROW_NUMBER() OVER(ORDER BY (SELECT 1))

Espero que este pequeño truco os pueda ser de ayuda.

Anuncios

7 comentarios to “Utilizar paginación en ASP.NET con SQL Server”

  1. Cojo…. ya si sacas el total de registros sería muy útil para paginaciones de tipo 30 de 120.

    • Efectivamente, ese es el objetivo. Con un simple count(*), obtendrías el total de registros, y podrías realizar realizar paginaciones del tipo x de xxx. Las consultas paginadas optimizan los datos transferidos por la red, haciendo que estas sean más ligeras y rápidas.

  2. y tambien puedo hacerlo con PHP, o solo con .net, no entendi muy bien esa parte.

    • Con php y mysql tienes métodos muy sencillos para realizarlo ya que mysql permite devolver los datos paginados directamente con el comando sql “limit”.

  3. qUE chido t rifaste con esa consulta, funciona chingon

  4. Interesante forma de hacerlo. Lo he intentado en Sql Server 2000 y no funciona (no reconoce Row_Number) pero si funciona en Sql Server 2008. Gracias por la idea.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: