
04/01/2010, 18:26
|
| | Fecha de Ingreso: diciembre-2009
Mensajes: 14
Antigüedad: 15 años, 3 meses Puntos: 0 | |
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
|