Ver Mensaje Individual
  #1 (permalink)  
Antiguo 04/01/2010, 18:26
gaviota81
 
Fecha de Ingreso: diciembre-2009
Mensajes: 14
Antigüedad: 14 años, 4 meses
Puntos: 0
Exclamación cambiar Cursor lento por SP

Hol,a en semanas anteriores publiqué una duda para realizar un sp o un cursor que me insertara en una tabla una consulta como esta: ' Hacer un match por registro en donde se evalua el campo CantidadPrendas, si este campo tuviera un valor mayor a 1, es necesario grabar un registro por cada unidad adicional al valor de 1. Por citar un ejemplo: si tuviera 2, hay que grabar 2 registros idénticos del archivo MOMBEF en lugar de 1 y así sucesivamente dependiendo de la cantidad que esté reflejada en el campo CantidadPrendas.

Esto lo resolví mediante el siguiente cursor, si lo hace bien pero se tarda mucho para cuando son millones de registros, alguna idea de como se puede mejorar o convertir en un SP para que sea más rápido??? muchas gracias!

Código:
IF OBJECT_ID('Carga_Boleta_Match') IS NOT NULL
 Drop Table Carga_Boleta_Match
go
create table Carga_Boleta_Match 
( Boleta bigint,
  CveArticulo bigint,
  desArticulo varchar(30),
  Peso real,
  Peso2 real,
  CantidadPrendas bigint,
  Comentario varchar(50))
  go
 
SET NOCOUNT ON   
 DECLARE @intFlag INT
 DECLARE @temp INT
 DECLARE @CantidadPrendas INT
 DECLARE @boleta VARCHAR(10)
 DECLARE @cveArticulo VARCHAR(10)
 DECLARE @desArticulo VARCHAR(10)
 DECLARE @peso VARCHAR(10) 
 DECLARE @peso2 REAL 
 DECLARE @comentario VARCHAR(10)
 DECLARE @Sucursal INT
 DECLARE articulos_cursor CURSOR FOR
 select b.CantidadPrendas,a.boleta,c.CveArticulo, c.DescArticulo, c.Peso,0 as peso2,'' as comentario
  FROM MOMBEF_Trabajo a, MOMBDF_1  b, MOARCF_1 c
  where a.Boleta=b.boleta
    and cast(a.sucursal as bigint)=b.sucursal
    and b.cveArticulo=c.CveArticulo
OPEN articulos_cursor;
 FETCH NEXT FROM articulos_cursor INTO @temp,@boleta,@cveArticulo,@desArticulo,@peso,@Peso2,@comentario;
 WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @intFlag = 0;
        WHILE  (@intFlag <@temp)
          BEGIN
              PRINT @temp
              INSERT INTO Carga_Boleta_Match 
              values (@boleta, @cveArticulo, @DesArticulo, @Peso,@Peso2,@temp, @comentario)
              SET @intFlag=@intFlag+1;
              IF @intFlag =@temp
                 BREAK
              ELSE 
                CONTINUE 
             END  
          UPDATE Carga_Boleta_Match 
             SET Comentario ='Validar', 
                 Peso2=Peso/CantidadPrendas
           WHERE CantidadPrendas >1
       FETCH NEXT FROM articulos_cursor INTO @temp,@boleta,@cveArticulo,@desArticulo,@peso,@peso2,@comentario;
    END
CLOSE articulos_cursor;
DEALLOCATE articulos_cursor;
GO