¿Cursor ó While?

07/03/2005 - 16:41 por Víctor | Informe spam
Buenas.

A ver la gente qué opina: ya se que si puedo, mejor que me olvide de los
cursores, así que se me ha ocurrido crear una variable del tipo table, con
el primer campo que sea un autoincrementable, de forma que para recorrer
esta tabla lo que hago es un while, y una consulta con indice = @x; es
decir:

declare @tbl_aux table (indice smallint identity(1, 1), nombre varchar(10),
apellido1 varchar(10), apellido2 varchar(10)9
declare @num_filas smallint
declare @x smallint

insert into @tbl_aux
select nom_nombre, nom_apell1, nom_apell2
from tbl_nombres

select @num_filas = count(indice) from @tbl_aux

set @x = 1
while (@x <= @num_filas)
begin
select * from @tbl_aux where indice = @x

set @x = @x + 1
end

¿Es buena idea o es igual de lento?

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
07/03/2005 - 19:45 | Informe spam
Victor,

Aca te paso otro link que habla sobre la simulacion de arreglos (arrays) en
t-sql. Tambien deberias tratar de buscar una solucion usando un documento XML.

Arrays and Lists in SQL Server
http://www.sommarskog.se/arrays-in-sql.html


AMB


"Víctor" wrote:

Cada ticket tiene un nombre, primer apellido, segundo apellido, y dni.

Esta información la recojo de una página asp, que la pasa a un SP en forma
de una cadena separada por '{'. Puede haber más de un ticket, por lo que
también, en otra variable, pasao el número de tickets.

Este SP, mediante un WHILE, recorre la cadena y separa el nmbre, apellidos y
dni, llama a otro SP para dar de alta un ticket, y vuelve a empezar.

Pero ahora rsulta que también debo de llamar a este procedure, pero en vez
desde la página asp, desde otro SP: entonces, necesito montar esta cadena de
nombre, apellidos y dni.



"Alejandro Mesa" escribió en el
mensaje news:
> Victor,
>
> Victor,
>
> Aca te paso un link con diferentes formas de hacer la concatenacion, la
> version que usa un cursor es la menos recomendada. Yo me pregunto por que
> debes pasar los valores en una cadena en vez de pasar el min y max del
> conjunto.
>
>
http://groups-beta.google.com/group...366dd9e73e
>
>
>
> Ejemplo:
>
>
> use northwind
> go
>
> create table t (
> colA int not null identity unique check(colA >= 0)
> )
> go
>
> set nocount on
>
> declare @i int
>
> set @i = 1
>
> while @i < 4001
> begin
> insert into t default values
> set @i = @i + 1
> end
> go
>
> create procedure proc1
> @i int,
> @j int
> as
> set nocount on
>
> select * from t
> where colA between @i and @j
> go
>
> create procedure proc2
> as
> set nocount on
>
> declare @i int
> declare @j int
>
> set @j = -1
>
> while 1 = 1
> begin
> select @i = min(colA), @j = max(colA)
> from (select top 50 colA from t where colA > @j order by colA asc) as a
>
> if @i is not null and @j is not null
> begin
> print @i
> print @j
> exec proc1 @i, @j
> end
> else
> break
>
> end
> go
>
> exec proc2
> go
>
> drop procedure proc2, proc1
> go
>
> drop table t
> go
>
>
> AMB
>
>
> "Víctor" wrote:
>
> > Pues resulta que tengo unos 4000 tickets, y tengo que recojer los 50
> > primeros y concatenar los número de tickets en una cadana, pasar esta
cadena
> > a un Stored Procedure, recojer los 50 siguientes tickets,...
> >
> > La única forma que se me ocurre es crear un CURSOR con una consulta TOP
50,
> > e ir recorriendo cada fila y añadarilo a una variable, luego borrar
estos 50
> > registros, y volver a crear otro CURSOR con 50 más,...
> >
> > Ó utilziar el códgio que he indicado.
> >
> > "Alejandro Mesa" escribió en
el
> > mensaje news:
> > > Victor,
> > >
> > > Cual es el proposito de este codigo?
> > >
> > >
> > > AMB
> > >
> > >
> > > "Víctor" wrote:
> > >
> > > > Buenas.
> > > >
> > > > A ver la gente qué opina: ya se que si puedo, mejor que me olvide de
los
> > > > cursores, así que se me ha ocurrido crear una variable del tipo
table,
> > con
> > > > el primer campo que sea un autoincrementable, de forma que para
recorrer
> > > > esta tabla lo que hago es un while, y una consulta con indice = @x;
es
> > > > decir:
> > > >
> > > > declare @tbl_aux table (indice smallint identity(1, 1), nombre
> > varchar(10),
> > > > apellido1 varchar(10), apellido2 varchar(10)9
> > > > declare @num_filas smallint
> > > > declare @x smallint
> > > >
> > > > insert into @tbl_aux
> > > > select nom_nombre, nom_apell1, nom_apell2
> > > > from tbl_nombres
> > > >
> > > > select @num_filas = count(indice) from @tbl_aux
> > > >
> > > > set @x = 1
> > > > while (@x <= @num_filas)
> > > > begin
> > > > select * from @tbl_aux where indice = @x
> > > >
> > > > set @x = @x + 1
> > > > end
> > > >
> > > > ¿Es buena idea o es igual de lento?
> > > >
> > > >
> > > >
> > > >
> >
> >
> >



Respuesta Responder a este mensaje
#7 Víctor
08/03/2005 - 09:15 | Informe spam
Gracias por el link; ahora le hecharé una ojeada.
¿XML? Uff, me encantaría aprender, pero no tengo tiempo. De todas formas,
¿sabes de algún enlace que explique de qué va y cómo programar?

"Alejandro Mesa" escribió en el
mensaje news:
Victor,

Aca te paso otro link que habla sobre la simulacion de arreglos (arrays)


en
t-sql. Tambien deberias tratar de buscar una solucion usando un documento


XML.

Arrays and Lists in SQL Server
http://www.sommarskog.se/arrays-in-sql.html


AMB


"Víctor" wrote:

> Cada ticket tiene un nombre, primer apellido, segundo apellido, y dni.
>
> Esta información la recojo de una página asp, que la pasa a un SP en


forma
> de una cadena separada por '{'. Puede haber más de un ticket, por lo que
> también, en otra variable, pasao el número de tickets.
>
> Este SP, mediante un WHILE, recorre la cadena y separa el nmbre,


apellidos y
> dni, llama a otro SP para dar de alta un ticket, y vuelve a empezar.
>
> Pero ahora rsulta que también debo de llamar a este procedure, pero en


vez
> desde la página asp, desde otro SP: entonces, necesito montar esta


cadena de
> nombre, apellidos y dni.
>
>
>
> "Alejandro Mesa" escribió en


el
> mensaje news:
> > Victor,
> >
> > Victor,
> >
> > Aca te paso un link con diferentes formas de hacer la concatenacion,


la
> > version que usa un cursor es la menos recomendada. Yo me pregunto por


que
> > debes pasar los valores en una cadena en vez de pasar el min y max del
> > conjunto.
> >
> >
>


http://groups-beta.google.com/group...366dd9e73e
> >
> >
> >
> > Ejemplo:
> >
> >
> > use northwind
> > go
> >
> > create table t (
> > colA int not null identity unique check(colA >= 0)
> > )
> > go
> >
> > set nocount on
> >
> > declare @i int
> >
> > set @i = 1
> >
> > while @i < 4001
> > begin
> > insert into t default values
> > set @i = @i + 1
> > end
> > go
> >
> > create procedure proc1
> > @i int,
> > @j int
> > as
> > set nocount on
> >
> > select * from t
> > where colA between @i and @j
> > go
> >
> > create procedure proc2
> > as
> > set nocount on
> >
> > declare @i int
> > declare @j int
> >
> > set @j = -1
> >
> > while 1 = 1
> > begin
> > select @i = min(colA), @j = max(colA)
> > from (select top 50 colA from t where colA > @j order by colA asc) as


a
> >
> > if @i is not null and @j is not null
> > begin
> > print @i
> > print @j
> > exec proc1 @i, @j
> > end
> > else
> > break
> >
> > end
> > go
> >
> > exec proc2
> > go
> >
> > drop procedure proc2, proc1
> > go
> >
> > drop table t
> > go
> >
> >
> > AMB
> >
> >
> > "Víctor" wrote:
> >
> > > Pues resulta que tengo unos 4000 tickets, y tengo que recojer los 50
> > > primeros y concatenar los número de tickets en una cadana, pasar


esta
> cadena
> > > a un Stored Procedure, recojer los 50 siguientes tickets,...
> > >
> > > La única forma que se me ocurre es crear un CURSOR con una consulta


TOP
> 50,
> > > e ir recorriendo cada fila y añadarilo a una variable, luego borrar
> estos 50
> > > registros, y volver a crear otro CURSOR con 50 más,...
> > >
> > > Ó utilziar el códgio que he indicado.
> > >
> > > "Alejandro Mesa" escribió


en
> el
> > > mensaje news:
> > > > Victor,
> > > >
> > > > Cual es el proposito de este codigo?
> > > >
> > > >
> > > > AMB
> > > >
> > > >
> > > > "Víctor" wrote:
> > > >
> > > > > Buenas.
> > > > >
> > > > > A ver la gente qué opina: ya se que si puedo, mejor que me


olvide de
> los
> > > > > cursores, así que se me ha ocurrido crear una variable del tipo
> table,
> > > con
> > > > > el primer campo que sea un autoincrementable, de forma que para
> recorrer
> > > > > esta tabla lo que hago es un while, y una consulta con indice @x;
> es
> > > > > decir:
> > > > >
> > > > > declare @tbl_aux table (indice smallint identity(1, 1), nombre
> > > varchar(10),
> > > > > apellido1 varchar(10), apellido2 varchar(10)9
> > > > > declare @num_filas smallint
> > > > > declare @x smallint
> > > > >
> > > > > insert into @tbl_aux
> > > > > select nom_nombre, nom_apell1, nom_apell2
> > > > > from tbl_nombres
> > > > >
> > > > > select @num_filas = count(indice) from @tbl_aux
> > > > >
> > > > > set @x = 1
> > > > > while (@x <= @num_filas)
> > > > > begin
> > > > > select * from @tbl_aux where indice = @x
> > > > >
> > > > > set @x = @x + 1
> > > > > end
> > > > >
> > > > > ¿Es buena idea o es igual de lento?
> > > > >
> > > > >
> > > > >
> > > > >
> > >
> > >
> > >
>
>
>
Respuesta Responder a este mensaje
#8 Carlos Sacristán
08/03/2005 - 10:00 | Informe spam
De http://www.sqlserverbyexample.com/XMLConSQL.pdf te puedes bajar el
capítulo gratuito del libro "SQL Server 2000: con ejemplos" de Fernando
Guerrero y Carlos E. Rojas que trata justamente de lo que tú necesitas. Está
bastante bien explicado, pero si quieres profundizar, siempre tienes los BOL


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Víctor" escribió en el mensaje
news:
Gracias por el link; ahora le hecharé una ojeada.
¿XML? Uff, me encantaría aprender, pero no tengo tiempo. De todas formas,
¿sabes de algún enlace que explique de qué va y cómo programar?

"Alejandro Mesa" escribió en el
mensaje news:
> Victor,
>
> Aca te paso otro link que habla sobre la simulacion de arreglos (arrays)
en
> t-sql. Tambien deberias tratar de buscar una solucion usando un


documento
XML.
>
> Arrays and Lists in SQL Server
> http://www.sommarskog.se/arrays-in-sql.html
>
>
> AMB
>
>
> "Víctor" wrote:
>
> > Cada ticket tiene un nombre, primer apellido, segundo apellido, y dni.
> >
> > Esta información la recojo de una página asp, que la pasa a un SP en
forma
> > de una cadena separada por '{'. Puede haber más de un ticket, por lo


que
> > también, en otra variable, pasao el número de tickets.
> >
> > Este SP, mediante un WHILE, recorre la cadena y separa el nmbre,
apellidos y
> > dni, llama a otro SP para dar de alta un ticket, y vuelve a empezar.
> >
> > Pero ahora rsulta que también debo de llamar a este procedure, pero en
vez
> > desde la página asp, desde otro SP: entonces, necesito montar esta
cadena de
> > nombre, apellidos y dni.
> >
> >
> >
> > "Alejandro Mesa" escribió en
el
> > mensaje news:
> > > Victor,
> > >
> > > Victor,
> > >
> > > Aca te paso un link con diferentes formas de hacer la concatenacion,
la
> > > version que usa un cursor es la menos recomendada. Yo me pregunto


por
que
> > > debes pasar los valores en una cadena en vez de pasar el min y max


del
> > > conjunto.
> > >
> > >
> >



http://groups-beta.google.com/group...gramming/m
sg/2d85bf366dd9e73e
> > >
> > >
> > >
> > > Ejemplo:
> > >
> > >
> > > use northwind
> > > go
> > >
> > > create table t (
> > > colA int not null identity unique check(colA >= 0)
> > > )
> > > go
> > >
> > > set nocount on
> > >
> > > declare @i int
> > >
> > > set @i = 1
> > >
> > > while @i < 4001
> > > begin
> > > insert into t default values
> > > set @i = @i + 1
> > > end
> > > go
> > >
> > > create procedure proc1
> > > @i int,
> > > @j int
> > > as
> > > set nocount on
> > >
> > > select * from t
> > > where colA between @i and @j
> > > go
> > >
> > > create procedure proc2
> > > as
> > > set nocount on
> > >
> > > declare @i int
> > > declare @j int
> > >
> > > set @j = -1
> > >
> > > while 1 = 1
> > > begin
> > > select @i = min(colA), @j = max(colA)
> > > from (select top 50 colA from t where colA > @j order by colA asc)


as
a
> > >
> > > if @i is not null and @j is not null
> > > begin
> > > print @i
> > > print @j
> > > exec proc1 @i, @j
> > > end
> > > else
> > > break
> > >
> > > end
> > > go
> > >
> > > exec proc2
> > > go
> > >
> > > drop procedure proc2, proc1
> > > go
> > >
> > > drop table t
> > > go
> > >
> > >
> > > AMB
> > >
> > >
> > > "Víctor" wrote:
> > >
> > > > Pues resulta que tengo unos 4000 tickets, y tengo que recojer los


50
> > > > primeros y concatenar los número de tickets en una cadana, pasar
esta
> > cadena
> > > > a un Stored Procedure, recojer los 50 siguientes tickets,...
> > > >
> > > > La única forma que se me ocurre es crear un CURSOR con una


consulta
TOP
> > 50,
> > > > e ir recorriendo cada fila y añadarilo a una variable, luego


borrar
> > estos 50
> > > > registros, y volver a crear otro CURSOR con 50 más,...
> > > >
> > > > Ó utilziar el códgio que he indicado.
> > > >
> > > > "Alejandro Mesa"


escribió
en
> > el
> > > > mensaje news:
> > > > > Victor,
> > > > >
> > > > > Cual es el proposito de este codigo?
> > > > >
> > > > >
> > > > > AMB
> > > > >
> > > > >
> > > > > "Víctor" wrote:
> > > > >
> > > > > > Buenas.
> > > > > >
> > > > > > A ver la gente qué opina: ya se que si puedo, mejor que me
olvide de
> > los
> > > > > > cursores, así que se me ha ocurrido crear una variable del


tipo
> > table,
> > > > con
> > > > > > el primer campo que sea un autoincrementable, de forma que


para
> > recorrer
> > > > > > esta tabla lo que hago es un while, y una consulta con indice
@x;
> > es
> > > > > > decir:
> > > > > >
> > > > > > declare @tbl_aux table (indice smallint identity(1, 1), nombre
> > > > varchar(10),
> > > > > > apellido1 varchar(10), apellido2 varchar(10)9
> > > > > > declare @num_filas smallint
> > > > > > declare @x smallint
> > > > > >
> > > > > > insert into @tbl_aux
> > > > > > select nom_nombre, nom_apell1, nom_apell2
> > > > > > from tbl_nombres
> > > > > >
> > > > > > select @num_filas = count(indice) from @tbl_aux
> > > > > >
> > > > > > set @x = 1
> > > > > > while (@x <= @num_filas)
> > > > > > begin
> > > > > > select * from @tbl_aux where indice = @x
> > > > > >
> > > > > > set @x = @x + 1
> > > > > > end
> > > > > >
> > > > > > ¿Es buena idea o es igual de lento?
> > > > > >
> > > > > >
> > > > > >
> > > > > >
> > > >
> > > >
> > > >
> >
> >
> >


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