¿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:
Mostrar la cita
#2 Alejandro Mesa
07/03/2005 - 17:09 | Informe spam
Victor,

Cual es el proposito de este codigo?


AMB


"Víctor" wrote:

Mostrar la cita
#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:
Mostrar la cita
con
Mostrar la cita
varchar(10),
Mostrar la cita
#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:

Mostrar la cita
#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:
Mostrar la cita
http://groups-beta.google.com/group...366dd9e73e
Mostrar la cita
cadena
Mostrar la cita
50,
Mostrar la cita
estos 50
Mostrar la cita
el
Mostrar la cita
los
Mostrar la cita
table,
Mostrar la cita
recorrer
Mostrar la cita
es
Mostrar la cita
Ads by Google
Search Busqueda sugerida