Consulta SQL Server por bloques

01/12/2003 - 21:29 por Sergio Gallardo Contreras | Informe spam
Quisiera que una consulta me regresara la información segmentada, por
ejemplo, que devolviera primero las 10 primeras filas de la consulta, luego
las siguientes 10, etc. para un motor de búsqueda tipo Google, Yahoo, etc.
Lo puedo hacer a nivel de recordset, pero quisiera que el servidor de base
de datos fuera el que hiciera el trabajo. Gracias.

Preguntas similare

Leer las respuestas

#6 Javier Loria
02/12/2003 - 14:31 | Informe spam
Hola Miguel:
No para nada me parece mal, con una mencion es suficiente :)
Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

Miguel Egea escribio:
jeje, en portalsql.com le recomendé este mecanísmo basandome en tu
idea. Si no te parece mal voy a publicar un ejemplo en portalsql.com
:-D



Miguel Egea
Microsoft SQL-SERVER MVP
Brigada Anti-Cursores
"Javier Loria" escribió en el mensaje
news:#
Hola:
A mi me gusta:
A mi me gusta utilizar el siguiente mecanismo:
/* Paginacion de Autores */
CREATE PROCEDURE Autores_Sel
@LastNombre varchar(40) = NULL OUTPUT
AS
SET NOCOUNT ON

SELECT TOP 5 WITH TIES *
FROM AUTHORS
WHERE CASE WHEN @LastNombre IS NULL THEN 1
WHEN @LastNombre<au_fname THEN 1
ELSE 0
END=1
ORDER BY AU_FNAME
SELECT @LastNombre=MAX(AU_FNAME)
FROM ( SELECT TOP 5 au_fname
FROM AUTHORS
WHERE CASE WHEN @LastNombre IS NULL THEN 1
WHEN @LastNombre<au_fname THEN 1
ELSE 0
END=1
ORDER BY AU_FNAME) AS N
GO
/* Fin de Declaracion de Procedimiento */

/* Uso de Procedimiento */
DECLARE @UltimoApellido varchar(40)

EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
/* Fin de Procedimiento */

Esto te permitira en la aplicacion cliente pedir bloques de filas
"consecutivos", usando el filtro y la siguiente corrida obtiene los
siguientes.

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Sergio Gallardo Contreras escribio:
Quisiera que una consulta me regresara la información segmentada,
por ejemplo, que devolviera primero las 10 primeras filas de la
consulta, luego las siguientes 10, etc. para un motor de búsqueda
tipo Google, Yahoo, etc. Lo puedo hacer a nivel de recordset, pero
quisiera que el servidor de base de datos fuera el que hiciera el
trabajo. Gracias.
Respuesta Responder a este mensaje
#7 ulises
02/12/2003 - 14:56 | Informe spam
Muchas gracias Javier, me agrada esa solución y con tu
permiso voy a usarlo, lo único es que le haría un par de
cambios, le quitaría el WITH TIES y reemplazaría la
condición ">" por ">=", ¿porque? ... generalmente cuando
pido desde el cliente una cantidad de registros a mostrar
me interesa que sea fija, es decir por ejemplo tengo 10
filas para mostrar 10 registros y si especifico WITH TIES
podría regresarme más de 10, generalmente lo que hago es
mostrar la cantidad fija de registros y en la siguiente
página mostrar en primer lugar el último registro de la
página anterior.

Gracias,
Ulises

Hola:
A mi me gusta:
A mi me gusta utilizar el siguiente mecanismo:
/* Paginacion de Autores */
CREATE PROCEDURE Autores_Sel
@LastNombre varchar(40) = NULL OUTPUT
AS
SET NOCOUNT ON

SELECT TOP 5 WITH TIES *
FROM AUTHORS
WHERE CASE WHEN @LastNombre IS NULL THEN 1
WHEN @LastNombre<au_fname THEN 1
ELSE 0
END=1
ORDER BY AU_FNAME
SELECT @LastNombre=MAX(AU_FNAME)
FROM ( SELECT TOP 5 au_fname
FROM AUTHORS
WHERE CASE WHEN @LastNombre IS NULL THEN 1
WHEN @LastNombre<au_fname THEN 1
ELSE 0
END=1
ORDER BY AU_FNAME) AS N
GO
/* Fin de Declaracion de Procedimiento */

/* Uso de Procedimiento */
DECLARE @UltimoApellido varchar(40)

EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
/* Fin de Procedimiento */

Esto te permitira en la aplicacion cliente pedir bloques


de filas
"consecutivos", usando el filtro y la siguiente corrida


obtiene los
siguientes.

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Sergio Gallardo Contreras


escribio:
Quisiera que una consulta me regresara la información




segmentada, por
ejemplo, que devolviera primero las 10 primeras filas




de la consulta,
luego las siguientes 10, etc. para un motor de búsqueda




tipo Google,
Yahoo, etc. Lo puedo hacer a nivel de recordset, pero




quisiera que el
servidor de base de datos fuera el que hiciera el




trabajo. Gracias.


.

Respuesta Responder a este mensaje
#8 Miguel Egea
02/12/2003 - 15:02 | Informe spam
Solo una cosa, si haces eso tendrás que meter además de esos cambios un
'unificador ' es decir agregar a tu condición una clave única si no no
sabrás por que registro te quedaste. Yo hago así las implementaicones
normalmente, además del lado de cliente, por eso me gustó tanto la
implementación de javier.

Saludos
Miguel Egea
"ulises" escribió en el mensaje
news:0bfe01c3b8dc$1eaa9ec0$
Muchas gracias Javier, me agrada esa solución y con tu
permiso voy a usarlo, lo único es que le haría un par de
cambios, le quitaría el WITH TIES y reemplazaría la
condición ">" por ">=", ¿porque? ... generalmente cuando
pido desde el cliente una cantidad de registros a mostrar
me interesa que sea fija, es decir por ejemplo tengo 10
filas para mostrar 10 registros y si especifico WITH TIES
podría regresarme más de 10, generalmente lo que hago es
mostrar la cantidad fija de registros y en la siguiente
página mostrar en primer lugar el último registro de la
página anterior.

Gracias,
Ulises

Hola:
A mi me gusta:
A mi me gusta utilizar el siguiente mecanismo:
/* Paginacion de Autores */
CREATE PROCEDURE Autores_Sel
@LastNombre varchar(40) = NULL OUTPUT
AS
SET NOCOUNT ON

SELECT TOP 5 WITH TIES *
FROM AUTHORS
WHERE CASE WHEN @LastNombre IS NULL THEN 1
WHEN @LastNombre<au_fname THEN 1
ELSE 0
END=1
ORDER BY AU_FNAME
SELECT @LastNombre=MAX(AU_FNAME)
FROM ( SELECT TOP 5 au_fname
FROM AUTHORS
WHERE CASE WHEN @LastNombre IS NULL THEN 1
WHEN @LastNombre<au_fname THEN 1
ELSE 0
END=1
ORDER BY AU_FNAME) AS N
GO
/* Fin de Declaracion de Procedimiento */

/* Uso de Procedimiento */
DECLARE @UltimoApellido varchar(40)

EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
/* Fin de Procedimiento */

Esto te permitira en la aplicacion cliente pedir bloques


de filas
"consecutivos", usando el filtro y la siguiente corrida


obtiene los
siguientes.

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Sergio Gallardo Contreras


escribio:
Quisiera que una consulta me regresara la información




segmentada, por
ejemplo, que devolviera primero las 10 primeras filas




de la consulta,
luego las siguientes 10, etc. para un motor de búsqueda




tipo Google,
Yahoo, etc. Lo puedo hacer a nivel de recordset, pero




quisiera que el
servidor de base de datos fuera el que hiciera el




trabajo. Gracias.


.

Respuesta Responder a este mensaje
#9 Javier Loria
02/12/2003 - 15:19 | Informe spam
Hola Ulises:
Si usas una Llave Primaria o UNIQUE NO necesitas el WITH TIES, porque
sabes exactamente cual es la fila, pero si tienes un campo para ordenar que
no es unico se producen empates y podrias perder filas!. Por ejemplo: usando
bloques de 5 ocurre que la 5ta y 6ta Fila se apellidan LORIA, el TOP solo
presentara la 5ta y la siguiente vez si dejas el mayor que(>) presenta de
la 7ma en adelante, si pones >= repite la 5ta. :(
Mi ultima version es un poco diferente para evitar esto. Lo estoy usando
en un ordenamiento que es una combinacion de una columna cualquiera con la
llave primaria, algo como ORDER BY ColumnaOrden, LlavePrimaria, y con eso me
evito el WITH TIES, sin perder filas.
Por cierto, si tienes indice sobre el campo de ordenamiento y si usas
DataSets de ADO.NET, el redimiento es MUY, MUY, bueno.
Espero te sirva,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.

ulises escribio:
Muchas gracias Javier, me agrada esa solución y con tu
permiso voy a usarlo, lo único es que le haría un par de
cambios, le quitaría el WITH TIES y reemplazaría la
condición ">" por ">=", ¿porque? ... generalmente cuando
pido desde el cliente una cantidad de registros a mostrar
me interesa que sea fija, es decir por ejemplo tengo 10
filas para mostrar 10 registros y si especifico WITH TIES
podría regresarme más de 10, generalmente lo que hago es
mostrar la cantidad fija de registros y en la siguiente
página mostrar en primer lugar el último registro de la
página anterior.

Gracias,
Ulises

Hola:
A mi me gusta:
A mi me gusta utilizar el siguiente mecanismo:
/* Paginacion de Autores */
CREATE PROCEDURE Autores_Sel
@LastNombre varchar(40) = NULL OUTPUT
AS
SET NOCOUNT ON

SELECT TOP 5 WITH TIES *
FROM AUTHORS
WHERE CASE WHEN @LastNombre IS NULL THEN 1
WHEN @LastNombre<au_fname THEN 1
ELSE 0
END=1
ORDER BY AU_FNAME
SELECT @LastNombre=MAX(AU_FNAME)
FROM ( SELECT TOP 5 au_fname
FROM AUTHORS
WHERE CASE WHEN @LastNombre IS NULL THEN 1
WHEN @LastNombre<au_fname THEN 1
ELSE 0
END=1
ORDER BY AU_FNAME) AS N
GO
/* Fin de Declaracion de Procedimiento */

/* Uso de Procedimiento */
DECLARE @UltimoApellido varchar(40)

EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
EXEC Autores_Sel @UltimoApellido OUTPUT
/* Fin de Procedimiento */

Esto te permitira en la aplicacion cliente pedir bloques de filas
"consecutivos", usando el filtro y la siguiente corrida obtiene los
siguientes.

Saludos,


Javier Loria
Costa Rica
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.
Sergio Gallardo Contreras


escribio:
Quisiera que una consulta me regresara la información segmentada,
por ejemplo, que devolviera primero las 10 primeras filas de la
consulta, luego las siguientes 10, etc. para un motor de búsqueda
tipo Google, Yahoo, etc. Lo puedo hacer a nivel de recordset, pero
quisiera que el servidor de base de datos fuera el que hiciera el
trabajo. Gracias.




.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida