En mySql tenemos una opción para las consultas Select que nos permite decirle a la base de datos que devuelva un rango de resultados deseados en vez de todos lo que puede devolver dicha consulta Select. Por ejemplo una consulta con Limit sería:
Select * from Base_de_datos Limit 4,8
Esto nos devuelve un rango de 8 resultados desde el 4º encontrado (ideal para paginaciones)
En sqlServer no disponemos de la opción Limit, por lo que debemos usar la opción ROW_NUMBER() OVER y asignarlo a un alias, como vemos en la siguiente consulta:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) as row FROM Base_de_datos ) as alias WHERE row > 4 and row <= 12
Esto nos devuelve un rango de 8 resultados desde el 4º encontrado (el rango estaría especificado entre 8 y 12)
Mayo 29th, 2007 at 11:37 pm
Te compadezco por tener que lidiar con SQL Server.
Mayo 29th, 2007 at 11:41 pm
Jajaja bueno estoy con la 2005… las otras me dan escalofrios

Por cierto, felicidades por la boda!!
Junio 3rd, 2007 at 5:07 am
[...] igual que ésta semana anotaba cómo hacer consultas con Limit en Sql Server 2005, en éste post le toca el turno a [...]
Diciembre 2nd, 2007 at 8:48 pm
germanachar(at)yahoo(dot)com(dot)ar
Sabe si esta consulta es compatible con el estandar SQL92?
Sino, como podria hacer una consulta utilizando subconsultas que emulen LIMIT x,y?
Sin usar vistas ni tablas auxiliares ni with.
Marzo 6th, 2008 at 9:28 pm
Existe una forma de obtener el mismo resultado de las funciones Limit y Offset de MYSQL y Postgre en SQL Server, sin necesidad de estar creando Stored Procedure del lado servidor, los cuales retrasan los tiempos de respuestas
motivado a la creación de tablas temporales a fin de crear un Index propio el cual sevirá de referencia para la busqueda.
Esta función es de facil manejo simplemente retorna un SQLquery adaptado a nuestra necesidad, y los únicos parámetros exigidos es el SQL de nuestra consulta, el campo clave de la misma, la pagina a visualizar y por último la cantidad de registro por página.
El código es el siguiente, esta desarrollado en Visual Basic sin embargo su adaptación a caulquier lenguaje será sencilla:
———————————————–
Function SQLpaginar(SQL As String, Clave As String, Pagina As Integer, Cantidad As Integer)
If Pagina > 0 And Cantidad > 0 And Clave “” Then
Dim Fsql As String, Dsql As String, Asql As String
Fsql = “SELECT TOP ” & Pagina * Cantidad & ” * FROM (” & SQL & “) DERIVEDTBL”
Dsql = “SELECT TOP ” & Cantidad & ” * FROM (” & Fsql & “) DERIVEDTBL ORDER BY ” & Clave & ” DESC”
Asql = “SELECT TOP ” & Cantidad & ” * FROM (” & Dsql & “) DERIVEDTBL ORDER BY ” & Clave & ” ASC”
SQLpaginar = Asql
Else
SQLpaginar = SQL
End If
End Function
——————————————–
Marzo 7th, 2008 at 9:06 pm
Esa respuesta, al menos a mi no me sirve. Hice la pregunta y traigo la respuesta.
Una sub - consulta SQL92 estandar que limita una busqueda a una cierta cantidad de resultados para mi esquema de empresa de transporte (si alguien puede explicar en que orden se va haciendo la consulta?) es la siguiente. (Esto no es tan facil de encontrar, guardenla!):
## FIGURITA DIFICIL. Consulta estandar SQL92
## que limita los resultados de una consulta
select (
select count(*) from servicio s1
where s1.patente <= s2.patente) as fila, patente
from servicio s2
where(
select count(*) from servicio s1
where s1.patente <= s2.patente)<=5
order by patente desc;
Noviembre 17th, 2008 at 7:31 pm
Muy buena solución, muchas gracias al final puede quedar así:
ALTER PROCEDURE [dbo].[litapaginada]
@startRow int,
@maxRow int
AS
BEGIN
SELECT * FROM (
SELECT ROW_NUMBER() OVER (ORDER BY idxxx) as ‘idfila’ , * FROM tabla
) as tabla
WHERE idfila @startRow 1 and @maxRow
END