Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Paginar resultados

Estas en el tema de Paginar resultados en el foro de SQL Server en Foros del Web. Hola, como alternativas para paginar resultados en SQL Server, he encontrado aquí este post , que no se adapta muy bien a mis necesidades y ...
  #1 (permalink)  
Antiguo 23/10/2007, 02:21
Avatar de PosProdukcion  
Fecha de Ingreso: noviembre-2004
Ubicación: Manzanares el Real (Madrid)
Mensajes: 726
Antigüedad: 19 años, 5 meses
Puntos: 9
Paginar resultados

Hola, como alternativas para paginar resultados en SQL Server, he encontrado aquí este post, que no se adapta muy bien a mis necesidades y esta otra query:

Código:
SELECT TOP 20 t.indice, t.descripcion
  FROM tabla t
  WHERE (
        SELECT count(*) as total
             FROM tabla t2
             WHERE t2.indice <= t t.indice
            AND t2.descripcion like 'a%'
            ) > (20 - 1) - 20
    AND t.descripcion like 'a%'
Que en querys con where complejos y muchos join se puede volver un poco infernal y ademas no se como de eficiente es con ese anidamiento y Count(*).

De momento mis alternativas son:

A - Paginar en ASP => Cada cambio de pagina tengo que recuperar TODOS los registros, auqnue solo vaya a ver 20
B - Usar esta query => ¿Es ineficiente?

Me planteo usar la segunda cuando sea una tabla con muchos registros,

¿que pensais que es MUCHOS REGISTROS para que resulte necesario usar la alternativa B?
¿Conocéis otra solución?

Gracias
  #2 (permalink)  
Antiguo 23/10/2007, 02:21
Avatar de PosProdukcion  
Fecha de Ingreso: noviembre-2004
Ubicación: Manzanares el Real (Madrid)
Mensajes: 726
Antigüedad: 19 años, 5 meses
Puntos: 9
Re: Paginar resultados

Edito: Por cierto, la query la he sacado de este blog
  #3 (permalink)  
Antiguo 24/10/2007, 09:28
Avatar de royrojas  
Fecha de Ingreso: diciembre-2004
Mensajes: 458
Antigüedad: 19 años, 4 meses
Puntos: 3
Re: Paginar resultados

yo utilizo un procedimiento almacenado que me pagina. yo le paso por parametros el numero de registros que va a tener la pagina y la pagina que quiero mostrar.
Al final del procedimiento llamo a la funcion CantidadPaginas, lo que hace es retornarme la cantidad de paginas que corresponderian a esta consulta, para yo poder hacer la paginacion manual.

a mi me parece que asi es mucho mas eficiente y yo manejando grandes cantidades de datos me ha resultado muy bien.


CREATE PROCEDURE [rcListar_Noticia_Pag](
@num_registros smallint = 100,
@num_pagina smallint = 1)
AS
SET NOCOUNT ON
BEGIN

Declare @NoRegs as smallint
SET @NoRegs = @num_registros * (@num_pagina - 1)

SELECT TOP(@num_registros)
[id_noticia]
,[nom_noticia]
--,[des_noticia]
,[fec_noticia]
,[fec_vencimiento]
,[ind_estado]
,[num_vistas]
FROM [vrcNoticia]
WHERE [id_noticia] not in(
SELECT TOP(@NoRegs) [id_noticia]
FROM vrcNoticia
ORDER BY [id_noticia] DESC)
ORDER BY [id_noticia] DESC

/* Retorna el numero total de paginas */
DECLARE @CantidadRegistros as smallint
SELECT @CantidadRegistros = COUNT(*) FROM [vrcNoticia]
SELECT dbo.CantidadPaginas(@CantidadRegistros,@num_regist ros) TotalPaginas

END
__________________
roy rojas
Programación en Español: DotNetcr.com
  #4 (permalink)  
Antiguo 14/12/2007, 05:12
Avatar de PosProdukcion  
Fecha de Ingreso: noviembre-2004
Ubicación: Manzanares el Real (Madrid)
Mensajes: 726
Antigüedad: 19 años, 5 meses
Puntos: 9
Re: Paginar resultados

Cita:
Iniciado por royrojas Ver Mensaje
y

CREATE PROCEDURE [rcListar_Noticia_Pag](
@num_registros smallint = 100,
@num_pagina smallint = 1)
AS
SET NOCOUNT ON
BEGIN

Declare @NoRegs as smallint
SET @NoRegs = @num_registros * (@num_pagina - 1)

SELECT TOP(@num_registros)

[id_noticia]
,[nom_noticia]
--,[des_noticia]
,[fec_noticia]
,[fec_vencimiento]
,[ind_estado]
,[num_vistas]
FROM [vrcNoticia]
WHERE [id_noticia] not in(
SELECT TOP(@NoRegs) [id_noticia]
FROM vrcNoticia
ORDER BY [id_noticia] DESC)
ORDER BY [id_noticia] DESC

/* Retorna el numero total de paginas */
DECLARE @CantidadRegistros as smallint
SELECT @CantidadRegistros = COUNT(*) FROM [vrcNoticia]
SELECT dbo.CantidadPaginas(@CantidadRegistros,@num_regist ros) TotalPaginas

END
Hola de nuevo, retomando este asunto (casi 2 meses después!!!), en la solución que me comentas haces dos veces TOP(@variable), esto da error (estoy en SQL Server 2000) y según he visto en varios sitios (p.ej aquí), no hay muchas más alternativas que usar sentencias dinámicas, como meter la select en un varchar y usar Execute, ya que al usar dos TOP (valores_distintos) tampoco me sirve la solución de SET ROWCOUNT.

¿Alguna solución mejor que las sentencias dinámicas para paginar resultados en servidor?? Creo que al final optaré por estas, pero bueno, pregunto por si proponéis algo más

Gracias
  #5 (permalink)  
Antiguo 14/12/2007, 08:45
Avatar de royrojas  
Fecha de Ingreso: diciembre-2004
Mensajes: 458
Antigüedad: 19 años, 4 meses
Puntos: 3
Re: Paginar resultados

si en sql 200 este codigo da error, lo que se debe hacer es meter todo el codigo en un string y ejecutarlo. El problema es con el TOP, que antes no era tan flexible como lo es ahora en el 2005.

Ese mismo procedimiento, cuando lo tenia en sql 2000 lo usaba asi

Código:
CREATE PROCEDURE DN_LIB_TraerNoticiasPag(
@num_registros int = 100,
@num_pagina int = 1
)
as
set nocount on
begin
/*
Retorna los noticias registradas por la pagina indicada.
*/
Declare @SQLstr as varchar(8000)
Declare @NoRegs as int
SET @NoRegs = @num_registros * (@num_pagina - 1)


SET @SQLstr =  'SELECT TOP ' + CAST(@num_registros AS VARCHAR(5)) +
'  N.cod_noticia  CodigoNoticia, ' +
'  N.nom_noticia NombreNoticia, ' +
'  substring(N.des_noticia,1,400) DescripcionNoticia, ' +
'  N.fec_ingreso FechaIngreso, ' +
'  N.num_vistas NumeroVisitas ' +
'FROM DN_LIB_NOTICIAS N ' +
'WHERE cod_noticia not in( ' +
'  SELECT TOP ' + CAST(@NoRegs AS VARCHAR(5)) + ' cod_noticia ' +
'  FROM DN_LIB_NOTICIAS ' +
'  ORDER BY cod_noticia DESC ' +
'  ) ' +
'ORDER BY cod_noticia DESC '

EXEC(@SQLstr)

/* Retorna el numero total de paginas */
DECLARE @CantidadRegistros as smallint
SELECT @CantidadRegistros = COUNT(*) FROM [vrcNoticia]
SELECT dbo.CantidadPaginas(@CantidadRegistros,@num_regist ros) TotalPaginas

end
Entonces ahi te queda el mismo procedimiento en las dos versiones para sql 2005 o sql 2000.
__________________
roy rojas
Programación en Español: DotNetcr.com
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:58.