Paginar resultados en SQL Server 2000, al estilo Limit de mySQL

En mysql para devolver un rango de resultados en una consulta podemos hacerlo usando el comando Limit de la siguiente forma:

Select * from tabla Limit 4,8

Esto nos devuelve un rango de 8 resultados desde el 4º encontrado

Apunté como hacerlo en Oracle, también como hacerlo en Microsoft SQL Server 2005/2008, y ahora lo apunto para SQL Server 2000.

SELECT TOP 10 t.* FROM tabla as t where t.id = not in
( SELECT TOP 0 id from tabla order by id desc )
order by t.id desc


El primer TOP, el principal, indica el número de tuplas a devolver.

El segundo TOP, en la subconsulta, debe ser multiplicar 10 por el número de página de resultados a mostrar menos 1, es decir: (número de página-1) x número de filas a devolver.

En ese ejemplo, el top para la subconsulta sería 0 para la primera página, 10 para la segunda, 20 para la tercera y así sucesivamente.

Sobre Asier

Arquitecto web enganchado al desarrollo, estudio y planteamiento de proyectos en internet. Trabajo en Blackslot, empresa que fundé en el 2009. Me encanta el cine, el café, el sexo, la cultura geek, la cultura oriental y la música electrónica.
Artículo publicado en Bases de Datos, Desarrollo, Desarrollo Web, Sistemas. Enlace a esta entrada..

7 espuestas a Paginar resultados en SQL Server 2000, al estilo Limit de mySQL

  1. Alberto de Tena dijo:

    No es la query mas optima del mundo, y si estas en una pagina muy alta puede hacer sufrir mucho a tu BBDD. Ademas, si tienes los records ordenador por id no seria mas facil jugar con esos datos? Siempre es mejor que un NOT IN.

    Al menos, pon un indice en el ID.

  2. @Alberto no no lo es, soy consciente. En este caso hay que jugar con la cache y evitar hacer paginaciones numéricas.
    Sql Server no contaba con la función row_number ni similar en la versión 2000.

  3. Juan dijo:

    Asier, muchas gracias por el artículo.

    Eres un crack!

  4. gabriel dijo:

    no funciona bien lo del top con id autonumericos.!!!!!!

  5. miguelon dijo:

    SELECT TOP 10 t.* FROM tabla as t where t.id not in
    ( SELECT TOP 0 id from tabla order by id desc )
    order by t.id desc

    una pequeña modificacion, tenia un igual antes del “not in”

  6. Anderson dijo:

    La consulta no funciona con el Order By DESC, en el caso de que el id sea autonumerico.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos requeridos, están marcados *

*

Puedes usar las siguientes etiquetas y atributos HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Notificarme los nuevos comentarios por correo electrónico. Tambien puedes suscribirte sin comentar.