Saludo al Visitante

Bienvenido a mi web

jueves, febrero 01, 2007

Equivalente al LIMIT de MySQL en SQL SERVER

Todos sabemos que es un dolor de cabeza paginar una selección de registros en SQL SERVER ya que en ninguna de sus versiones, existe una función parecida al LIMIT de MySQL.
Pero bueno que podemos hacer para quitarnos el dolor de cabeza.
  • Primero que todo, diseñar bien nuestras tablas:
Digo diseñar bien, porque si la tabla que vamos a paginar no tiene un campo identity o que enumere consecutivamente los registros, no podremos realizar el paginado con éxito. Esto no quiere decir que con otro tipo de campo no se pueda realizar la limitación de la selección, que no es más que la base del paginado.

  • Luego de tener bien diseñada la tabla, para limitar la selección ejecutamos la siguiente query:
SELECT TOP(cantidad_de_reg_x_pagina) * FROM nombre_tabla WHERE campo_id BETWEEN num_ini AND cant_reg_de_la _tabla

En la consulta usamos el TOP() para seleccionar realmente la cantidad de records que deseamos, si no lo usamos corremos el riesgo que en el intervalo de registros que vamos a listar, se hayan borrado algunos records y entonces si el paginado nos tenía que mostrar 20 registros y se borraron 2, solo nos mostrará 18.

Esto se puede realizar con cualquier tipo de datos no se limita solamente al campo identity de una tabla, pero se debe tener cuidado a la hora de elegir el campo, este debe ser una columna donde no se repitan los récords.

Carlos Hernández Güell

9 comentarios:

Anónimo dijo...

Quiero felicitarte por exponer una solución tan secilla y efectiva, el año pasado estuve programado con mysql y hace unos días tube que usar sqlserver mi sorpresa fue que no habia LIMIT, pero con tu ayuda pude solucionar el problema
rápidamente.

Un saludo de agradecimiento desde México

Atte: Alfonso

Anónimo dijo...

Pues esto sigue sin servir, ya que en una tabla, la cual yo no diseñe, no existe un campo de ID o alguna numeracion consecutiva, pero si necesito obtener la fila 1, o la 2 o la 3, segun yo quiera, pero sin una columna de id, esta solucion o sirve.

Anónimo dijo...

a mi me da problemas al paginar una tabla con elementos eliminados al haber un salto de registros en el campo id ya que los ultimos no se me muestran (los campos id van del 1 al 9 luego tengo un salto hasta el 18 que no se me muestra)

Anónimo dijo...

Dezguell, la solucion que propones no es genérica y depende del diseño (y los datos) de la tabla.
Aqui una solucion genérica:

SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) as nfila FROM nombre_tabla ) AS cualquier_alias WHERE nfila BETWEEN 20 AND 50

Saludos, desde La Paz-Bolivia
Edgarin
edgarinvillegas@hotmail.com

Anónimo dijo...

Por si alguien no entendio mi anterior post, aqui pongo un ejemplo:
En Mysql (con LIMIT):

SELECT EST_NOMBRE, EST_NUMEROSERIE
FROM ESTACION
ORDER BY est_id
LIMIT 2, 8

En SQL Server 2005 (sin LIMIT):

SELECT EST_NOMBRE, EST_NUMEROSERIE
FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY est_id) AS nfila FROM ESTACION
) AS ESTACION_NUMERADA
WHERE nfila BETWEEN 2 AND 8

Saludos, desde La Paz-Bolivia
Edgarin
edgarinvillegas@hotmail.com

Anónimo dijo...

umm limit en sql seria asi xD

create proc create proc sp_limit
@ini int,
@fin int
as
select * from (
select row_number() over(order by nomcli)as rownum , nomcli from clientes
)as a
where a.rownum between @ini and @fin
@ini int,
@fin int
as
select * from (
select row_number() over(order by nomcli)as rownum , nomcli from clientes
)as a
where a.rownum between @ini and @fin
go
exec sp_limit 2, 5

Anónimo dijo...

Ryuk.. exelente tu aporte.. lo aplique en mis procedimientos sql con paginas asp... y funcionan la raja.. te mereces un premio nobel de informatica,,, gracias... gracias totales... de parte de un Chileno......

Anónimo dijo...

buen dia, exelente el aporte. Lo quise hacer pero con tablas convinadas osea INNER JOIN y no funciona, aqui les muestro el codigo a ver si me pueden ayudar,de antemano gracias:

select *
from(
SELECT *,ROW_NUMBER() OVER(ORDER BY a.codigo_Articulo) AS X FROM tbl_Articulo a INNER JOIN tbl_mst_Almacen b ON a.codigo_almacen=b.codigo_almacen
) as Y
WHERE X BETWEEN '1' AND '20'

Unknown dijo...

Excelente Dezguel, la función row_number() de sqlserver me parece tonta, ya que primero enumera la totalidad de resultados y luego a eso recién le hace la consulta. Esta solución me parece óptima, uso id's consecutivas en todas mis tablas para facilitar las búsquedas y por lo visto una vez mas me facilita el trabajo. Gracias