Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/01/2010, 17:07
tarlipes
 
Fecha de Ingreso: diciembre-2002
Ubicación: argentina... de ahí seran veinte cuadras
Mensajes: 382
Antigüedad: 21 años, 4 meses
Puntos: 0
Optimizar cursor

Hola gente:

Tengo una tabla con columnas que indican clases para cada registro. tengo que obtener para cada registro, cuantas veces se repite cada clase.

armé este cursor que me resuelve el problema, pero tarda muchícimo. Alguna alternativa o forma de optimizarlo?

Código:
declare @id as int
declare @columna1 as varchar(50)
declare @columna2 as varchar(50)
declare @columna3 as varchar(50)
declare @columna4 as varchar(50)
declare @columna5 as varchar(50)
declare @columna6 as varchar(50)
declare @columna7 as varchar(50)
declare @columna8 as varchar(50)
declare @columna9 as varchar(50)
declare @columna10 as varchar(50)
delete from procesado

declare cur cursor for
select id, class0, class1, class2, class3, class4, class5, class6, class7, class8, class9 from total

    open cur
        -- Avanzamos un registro y cargamos en las variables los valores encontrados en el primer registro
  fetch next from cur
  into @id, @columna1, @columna2, @columna3, @columna4, @columna5, @columna6,@columna7, @columna8, @columna9, @columna10 
      while @@fetch_status = 0
    begin
    
   BEGIN TRY
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna1,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna1
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna2,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna2
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna3,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna3
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna4,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna4
END CATCH
begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna5,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna5
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna6,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna6
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna7,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna7
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna8,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna8
END CATCH


begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna9,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna9
END CATCH

begin try
INSERT INTO procesado (id,clase,cantidad) VALUES (@id,@columna10,1)
END TRY
BEGIN CATCH
UPDATE procesado SET cantidad = cantidad + 1 WHERE ID = @ID and clase= @columna10
END CATCH

     
    -- Avanzamos otro registro
    fetch next from cur
   into @id, @columna1, @columna2, @columna3, @columna4, @columna5, @columna6,@columna7, @columna8, @columna9, @columna10
       end
    -- cerramos el cursor
        close cur
  deallocate cur

Muchas gracias desde ya
__________________
Juan Pablo