Clausula TOP y rowcount

02/07/2004 - 10:47 por J | Informe spam
Hola a todos!

alguien ha tenido alguna vez que pelearse con la clausula top, del estilo
Select top 100 * from
esto es para obtener los primeros 100 registros,
pero si quiero obtener los 100 siguientes??
existe alguna claúsula similar??

la tabla sobre la que trabajo es horrible (la tabla de traces de sql server)
así que no hay ningún campo ni conjunto de campos que identifiquen
unicamente el registro, por lo que no puedo hacer selects anidados para
obtener los 100 siguientes,
necesito algo parecido al top pero con un rango (en mySQL se llama limit) o
un rowcount (que creo que tampoco existe en sqlserver)

Bueno, espero que alguien me pueda ayudar

un saludo y gracias

Preguntas similare

Leer las respuestas

#6 Isaías
02/07/2004 - 20:14 | Informe spam
Le entro a la discusion.

Proceso llamadas telefonicas de alto trafico, hasta 4.5
millones de registros por cada media hora, mi PK es un
IDENTITY y no tengo problema alguno.

¿Que tal?
Respuesta Responder a este mensaje
#7 Javier Loria
03/07/2004 - 16:21 | Informe spam
Hola Isaias:
Si realmente quieres discutir, tenemos que presentar argumentos formales
o demostraciones a favor y en contra. Si los argumentos son: yo lo uso y
funciona no va a existir discusion :(.
Un ejemplo: durante casi 10 anos fui un fumador de 2 cajetillas diarias,
significa que puede haberme pararme en centro de la plaza y gritar vean como
fumo 40 cigarrillos diarios y no me enfermo!!!. Espero que estes de acuerdo
que ese comportamiento solo haria que duden de mi sanidad mental.
Se me ocurren algunas alternativas:
a) Discutimos sobre el esquema de tus tablas y vemos el efecto del
identity. En cuyo caso tienes que mostrarme el esquema con columnas, llaves
e indices, para poder hacerme una idea..
b) Discutimos teoria general de BD.
c) Lo dejamos pasar y seguimos teniendo escaramusas cada vez que escribo
sobre los identities :D
Si escoges la c), te dire que los Identities son como una vieja cancion de
Bonnie Tyler "It's A Heartache"
=It's a heartache
Nothing but a heartache
Hits you when it's too late
Hits you when you're down
=Traduccion Libre:
=Es una Angustia
Nada mas que una Angustia
Te golpea cuando ya es demasiado tarde
Te golpea cuando estas caido.
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. Saludos,


Isaías escribio:
Le entro a la discusion.

Proceso llamadas telefonicas de alto trafico, hasta 4.5
millones de registros por cada media hora, mi PK es un
IDENTITY y no tengo problema alguno.

¿Que tal?
Respuesta Responder a este mensaje
#8 MAXI
05/07/2004 - 04:54 | Informe spam
Perdon por meterme en esta discusion no!! pero como la misma sera eterna,
creo que primero debes mirar este articulo si no lo ha hecho hasta el
momento.

http://www.configuracionesintegrale...p?articulo!9

Mi opinion y experiencia me indica que los Identity como campos para mostrar
al usuario o como PK no son nada buenos, pero si son utiles para otras
cosas, por ej: Si tienes una tabla donde el PK es mas de un campo y quieres
hacer un Update especifico, es mas simple tener un Indetity y trabajar con
el para estas cosas, pero yo nunca los usaria como autonumerico de una
factura ni mucho menos!! para ello escribi mis propios SP y tengo mis
propias tablas de autonumeracion con sus respectivos sufijos y prefijos :-D

Un abrazo





Maxi

Buenos Aires - Argentina

Desarrollador .NET 3 Estrellas

Mail: Maxi_accotto[arroba]speedy.com.ar

MSN:


"Guido" escribió en el mensaje news:
Supongamos q yo elijo la B. pq es sabado y tengo ganas de discutir y
aprender algo (y no de trabajar)

cuales son los pros y contras de estas 3 implementaciones:
a) Identity
b) Id Numérico. Bloquear la tabla cuando se pide un nuevo id hasta q se
agrega el registro
c) Id Numérico. Alta en una transaccion sin bloquear nada
d) Id Numérico. Un marcianito le da el id al sp.

Me gusta la d. El tema es cual es la mejor opcion para hacer el
"marcianito repartidor de Id's ".
¿como lo harian?

Guido.-
Insetec
Argentina


Javier Loria wrote:
>
> Hola Isaias:
> Si realmente quieres discutir, tenemos que presentar argumentos


formales
> o demostraciones a favor y en contra. Si los argumentos son: yo lo uso y
> funciona no va a existir discusion :(.
> Un ejemplo: durante casi 10 anos fui un fumador de 2 cajetillas


diarias,
> significa que puede haberme pararme en centro de la plaza y gritar vean


como
> fumo 40 cigarrillos diarios y no me enfermo!!!. Espero que estes de


acuerdo
> que ese comportamiento solo haria que duden de mi sanidad mental.
> Se me ocurren algunas alternativas:
> a) Discutimos sobre el esquema de tus tablas y vemos el efecto del
> identity. En cuyo caso tienes que mostrarme el esquema con columnas,


llaves
> e indices, para poder hacerme una idea..
> b) Discutimos teoria general de BD.
> c) Lo dejamos pasar y seguimos teniendo escaramusas cada vez que


escribo
> sobre los identities :D
> Si escoges la c), te dire que los Identities son como una vieja cancion


de
> Bonnie Tyler "It's A Heartache"
> => > It's a heartache
> Nothing but a heartache
> Hits you when it's too late
> Hits you when you're down
> => > Traduccion Libre:
> => > Es una Angustia
> Nada mas que una Angustia
> Te golpea cuando ya es demasiado tarde
> Te golpea cuando estas caido.
> > > 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.> > Saludos,
>
> Isaías escribio:
> > Le entro a la discusion.
> >
> > Proceso llamadas telefonicas de alto trafico, hasta 4.5
> > millones de registros por cada media hora, mi PK es un
> > IDENTITY y no tengo problema alguno.
> >
> > ¿Que tal?
Respuesta Responder a este mensaje
#9 J
05/07/2004 - 09:48 | Informe spam
Hola Javier,
muchas gracias por tu respuesta,
pero en la tabla de trazas de SQL Server 2000 no veo que tengan el campo
rownumber, ¿me estoy equivocando?

Es decir, las trazas generadas por las funciones sp_trace_** sólo las puedo
definir en windows 2000 que yo sepa, con destino a un fichero binario
".trc", y la forma que yo conozco de acceder a ese fichero es mediante la
funcion fn_trace_gettable, al estilo "Select * from
::fn_trace_gettable('traza.trc', default);". Si quiero ir leyéndolas
periódicamente y coger sólo los registros añadidos, tengo que (además de
cuidar que no boren ficheros de traza) ir guárdándome el identificador de
cual es la última que le leido, y ya que no todas las trazas rellenan el
campo de fecha, ni SQLServer provee la propiedad rownumber para cada fila,
pues no encuentro una forma única de identificar un registro a partir del
cual hacer una segunda lectura.
Realizando, como imagino que decias de hacer, "select rownumber, * from
::fn_trace_gettable..." falla en la petición por no conocer el campo
rownumber. (y tampoco puedo ver la estructura de la tabla, porque no es una
tabla, sino un fichero binario al que se accede de forma similar a una
tabla)

El problema lo tengo más o menos solucionado, porque accedo a la consulta
via ODBC, y las clases que utilizo me permiten colocarme en una posición
absoluta de la tabla (sin tener que traerla entera al cliente).
Pero si me equivoco en lo que he expuesto, y podeis ayudarme a leer de otra
forma mejor, os estaré agradecido,

muchas gracias por vuestras respuestas

un saludo

Jesús



"Javier Loria" escribió en el mensaje
news:
Hola:
Ummm. Que version de SQL trabajas porque las trazas de SQL 2000 SI
TIENEN una llave primaria es la columna RowNumber?
Demasiadas veces tenemos que pelear con Tablas que no tienen llaves
Primarias y el problema es que son basureros de datos. Cuando los
proveedores de Datos(Microsoft, Oracle, DB2, Sybase, MySQL, etc.) ofrecen
algun numero de linea los programadores los usen como forma de navegar en


la
"Tabla/Matriz" de datos y se olvidan de las conceptos Basicos de Bases de
Datos. Oracle tiene el RowNum para simular esto, y el MS SQL heredo de
Sybase el no exponer el numero de fila sino el obligar a los programadores
que desean usarlo a declararlo explicitamente usando la propiedad


Identity.
Bastante mejores serian las aplicaciones si se eliminaran estas
opciones!!!.
En todo caso si no puedes o no quieres cambiar el esquema de tus


tablas,
y quieres paginar puedes hacerlo siguiendo el siguiente ejemplo:

Cursores de ADO
> Una opcion "hacia atras" es utilizar los Procedimientos Extendidos que
utiliza ADO para paginar. Yo no montaria una aplicacion sobre esta
arquitectura, pero si es codigo de una oportunidad puedes hacer algo como:
==> Codigo de Llenado de Tabla Basurero
SELECT * INTO Autores
FROM Pubs.dbo.Authors
UNION ALL SELECT * FROM Pubs.dbo.Authors
UNION ALL SELECT * FROM Pubs.dbo.Authors
DECLARE @P1 int, @P2 int, @P3 int, @P4 int
SELECT @P10150000, @P2=1, @P3=1, @P4#
EXEC sp_cursoropen @P1 output, N'SELECT * FROM Autores ORDER BY AU_ID',


@P2
output, @P3 output, @P4 output
exec sp_cursorfetch @p1, 16, 1, 5
exec sp_cursorfetch @p1, 16, 6, 5
exec sp_cursorclose @p1
Fin de Codigo
==> El codigo anterior permite usar las Tablas como si fueran arreglos de
datos, aun cuando no tengan ni llave Primaria, ni Identity, sin cambiar el
esquema de las tablas.
Los procedimientos usados no estan documentados y por ende pueden
cambiar entre versiones de SQL.
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.


J escribio:
> el RowCount, al menos el que yo conozco, existe pero como
>
> set rowcount = 100;
> select
>
> para bajarse de 100 en 100,
> pero para decirle a partir de determinado punto cien más, sin que
> tengan que cumplir ninguna otra condición, solamente que estén a
> partir de ese punto... no se me ocurre nada,
>
> gracias de todas formas, se os ocure alguna otra forma?
> a no ser que lo que haya dicho yo sea diferente a lo que te refieras,
> y puedes tener el rowcount como si fuera un campo más de la tabla...
>
>
>
> "Jomaweb" escribió en el mensaje
> news:%
>> En SQL server sí existe el ROWCOUNT.
>>
>>
>> "J" escribió en el mensaje
>> news:ODkp$
>>> Hola a todos!
>>>
>>> alguien ha tenido alguna vez que pelearse con la clausula top, del
>>> estilo Select top 100 * from
>>> esto es para obtener los primeros 100 registros,
>>> pero si quiero obtener los 100 siguientes??
>>> existe alguna claúsula similar??
>>>
>>> la tabla sobre la que trabajo es horrible (la tabla de traces de
>>> sql server) así que no hay ningún campo ni conjunto de campos que
>>> identifiquen unicamente el registro, por lo que no puedo hacer
>>> selects anidados para obtener los 100 siguientes,
>>> necesito algo parecido al top pero con un rango (en mySQL se llama
>>> limit) o un rowcount (que creo que tampoco existe en sqlserver)
>>>
>>> Bueno, espero que alguien me pueda ayudar
>>>
>>> un saludo y gracias


Respuesta Responder a este mensaje
#10 Javier Loria
05/07/2004 - 16:30 | Informe spam
Hola J:
Disculpa pero como no dijiste como capturabas las trazas, asumi (mal)
que usabas el profiler y no que cargabas directamente los datos con los
procedimientos. Si usas los procedimientos trace estos generan archivos y
estos no tienen una Llave Primaria clara, el Profiler genera una columna
RowNumber con un Identity.
Una alternativa, seria pasar los datos de la traza, periodicamente a una
tabla, para poder ejecutar consultas mas avanzadas y no tener que estar
trabajando contra el archivo. Esta tabla debe estar en un BD separada o si
es posible en otro servidor. Si vas a manejarlo en el mismo podrias filtras
las trazas para que no es incluyan en las mismas esta BD.
Una vez en una Tabla de SQL me parece, no estoy seguro, que la llave
primaria puede ser StartTime, Spid, ClientProcess. Tengo que hacer algunas
pruebas para estar seguro. Eventualmente aun cuando no sea llave primaria
puedes utilizar el StartTime como base para leer los datos, simplemente en
el proceso de importacion "cortas" el ultimo minuto y vuelves a leer los
datos.
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.
J escribio:
Hola Javier,
muchas gracias por tu respuesta,
pero en la tabla de trazas de SQL Server 2000 no veo que tengan el
campo rownumber, ¿me estoy equivocando?

Es decir, las trazas generadas por las funciones sp_trace_** sólo las
puedo definir en windows 2000 que yo sepa, con destino a un fichero
binario ".trc", y la forma que yo conozco de acceder a ese fichero es
mediante la funcion fn_trace_gettable, al estilo "Select * from
fn_trace_gettable('traza.trc', default);". Si quiero ir leyéndolas




periódicamente y coger sólo los registros añadidos, tengo que (además
de cuidar que no boren ficheros de traza) ir guárdándome el
identificador de cual es la última que le leido, y ya que no todas
las trazas rellenan el campo de fecha, ni SQLServer provee la
propiedad rownumber para cada fila, pues no encuentro una forma única
de identificar un registro a partir del cual hacer una segunda
lectura.
Realizando, como imagino que decias de hacer, "select rownumber, *
from
fn_trace_gettable..." falla en la petición por no conocer el campo




rownumber. (y tampoco puedo ver la estructura de la tabla, porque no
es una tabla, sino un fichero binario al que se accede de forma
similar a una tabla)

El problema lo tengo más o menos solucionado, porque accedo a la
consulta via ODBC, y las clases que utilizo me permiten colocarme en
una posición absoluta de la tabla (sin tener que traerla entera al
cliente).
Pero si me equivoco en lo que he expuesto, y podeis ayudarme a leer
de otra forma mejor, os estaré agradecido,

muchas gracias por vuestras respuestas

un saludo

Jesús



"Javier Loria" escribió en el mensaje
news:
Hola:
Ummm. Que version de SQL trabajas porque las trazas de SQL 2000
SI TIENEN una llave primaria es la columna RowNumber?
Demasiadas veces tenemos que pelear con Tablas que no tienen
llaves Primarias y el problema es que son basureros de datos. Cuando
los proveedores de Datos(Microsoft, Oracle, DB2, Sybase, MySQL,
etc.) ofrecen algun numero de linea los programadores los usen como
forma de navegar en la "Tabla/Matriz" de datos y se olvidan de las
conceptos Basicos de Bases de Datos. Oracle tiene el RowNum para
simular esto, y el MS SQL heredo de Sybase el no exponer el numero
de fila sino el obligar a los programadores que desean usarlo a
declararlo explicitamente usando la propiedad Identity. Bastante
mejores serian las aplicaciones si se eliminaran estas opciones!!!.
En todo caso si no puedes o no quieres cambiar el esquema de tus
tablas, y quieres paginar puedes hacerlo siguiendo el siguiente
ejemplo:

Cursores de ADO
>> Una opcion "hacia atras" es utilizar los Procedimientos
Extendidos que utiliza ADO para paginar. Yo no montaria una
aplicacion sobre esta arquitectura, pero si es codigo de una
oportunidad puedes hacer algo como:
Codigo de Llenado de Tabla
Basurero
SELECT * INTO Autores
FROM Pubs.dbo.Authors
UNION ALL SELECT * FROM Pubs.dbo.Authors
UNION ALL SELECT * FROM Pubs.dbo.Authors
DECLARE @P1 int, @P2 int, @P3 int, @P4 int
SELECT @P10150000, @P2=1, @P3=1, @P4#
EXEC sp_cursoropen @P1 output, N'SELECT * FROM Autores ORDER BY
AU_ID', @P2 output, @P3 output, @P4 output
exec sp_cursorfetch @p1, 16, 1, 5
exec sp_cursorfetch @p1, 16, 6, 5
exec sp_cursorclose @p1
Fin de Codigo
==>> El codigo anterior permite usar las Tablas como si fueran
arreglos de datos, aun cuando no tengan ni llave Primaria, ni
Identity, sin cambiar el esquema de las tablas.
Los procedimientos usados no estan documentados y por ende pueden
cambiar entre versiones de SQL.
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.


J escribio:
el RowCount, al menos el que yo conozco, existe pero como

set rowcount = 100;
select

para bajarse de 100 en 100,
pero para decirle a partir de determinado punto cien más, sin que
tengan que cumplir ninguna otra condición, solamente que estén a
partir de ese punto... no se me ocurre nada,

gracias de todas formas, se os ocure alguna otra forma?
a no ser que lo que haya dicho yo sea diferente a lo que te
refieras,
y puedes tener el rowcount como si fuera un campo más de la tabla...



"Jomaweb" escribió en el mensaje
news:%
En SQL server sí existe el ROWCOUNT.


"J" escribió en el mensaje
news:ODkp$
Hola a todos!

alguien ha tenido alguna vez que pelearse con la clausula top, del
estilo Select top 100 * from
esto es para obtener los primeros 100 registros,
pero si quiero obtener los 100 siguientes??
existe alguna claúsula similar??

la tabla sobre la que trabajo es horrible (la tabla de traces de
sql server) así que no hay ningún campo ni conjunto de campos que
identifiquen unicamente el registro, por lo que no puedo hacer
selects anidados para obtener los 100 siguientes,
necesito algo parecido al top pero con un rango (en mySQL se llama
limit) o un rowcount (que creo que tampoco existe en sqlserver)

Bueno, espero que alguien me pueda ayudar

un saludo y gracias
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida