¿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

#1 Maxi
07/03/2005 - 16:46 | Informe spam
Hola, para mi es una mala idea y te comento porque

1) Seguis pensando en filas y no conjunto de registros
2) Las variables tipo tabla consumen memoria RAM con lo cual puedes tener
algunos problemas serios, yo las usaria para casos muy especificos


Salu2
Maxi


"Víctor" escribió en el mensaje
news:
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
#2 Alejandro Mesa
07/03/2005 - 17:09 | Informe spam
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
#3 Víctor
07/03/2005 - 18:09 | Informe spam
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
#4 Alejandro Mesa
07/03/2005 - 18:43 | Informe spam
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
#5 Víctor
07/03/2005 - 18:57 | Informe spam
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
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida