Ver Mensaje Individual
  #1 (permalink)  
Antiguo 21/02/2010, 17:05
gaviota81
 
Fecha de Ingreso: diciembre-2009
Mensajes: 14
Antigüedad: 14 años, 5 meses
Puntos: 0
Exclamación Cambiar cursor por Funcion

HOla a todos! de nuevo tengo problemas con un cursor, bueno la cuestión es que más bien necesito cambiarlo por una función o un SP que me genere lo siguiente:

Un Folio tomando el campo de sucursal + el campo Año + un consecutivo de 7 posiciones, pero esto lo necesito por cada sucursal y por cada año, es decir:

para la sucursal 0001 año 2008 --> 0001080000001 ,0001080000002,0001080000003
para la sucursal 0001 año 2009 --> 0001090000001 ,0001090000002,0001090000003...
para la sucursal 0002 año 2007 --> 0002070000001 ,0002070000002
para la sucursal 0003 año 2009 --> 0003090000001 ,0003090000002,0003090000003...

y así sucesivamente...

Lo solucione con este cursor, pero obviamente estamuy pesado por que son 1,500,000 de registros:
Código:
BEGIN TRAN

	DECLARE @Sucursal INT
	DECLARE @Anio INT

	DECLARE Cursor1 CURSOR FOR
		SELECT DISTINCT 
			NIdSucursal,CONVERT(INT,YEAR(DEmpeno)) Anio
		FROM 
			Boletas 
		ORDER by 
			NIdSucursal,CONVERT(INT,YEAR(DEmpeno))

	OPEN Cursor1
		FETCH NEXT FROM Cursor1 
			INTO @Sucursal , @Anio 
		WHILE @@FETCH_STATUS = 0 
			BEGIN 
				CREATE TABLE #TEMPORAL 
				(
				NIdBoleta bigint,NIdSucursal bigint,VFolio char(30),Anio bigint,NuevoFolio char(30),Consecutivo bigint
				)
				INSERT INTO #TEMPORAL
					(NIdSucursal,NIdBoleta,VFolio,Anio,NuevoFolio,Consecutivo )
				SELECT 
					NIdSucursal,NIdBoleta,VFolio,YEAR(DEmpeno)Anio,
					(
					dbo.SEM_FAGREGAR_CEROS_IZQUIERDA(NIdSucursal,4)+
					dbo.SEM_FAGREGAR_CEROS_IZQUIERDA(SUBSTRING(CONVERT(VARCHAR,YEAR(DEmpeno)),3,2),2)+
					dbo.SEM_FAGREGAR_CEROS_IZQUIERDA((CASE WHEN (ROW_NUMBER() OVER(ORDER BY NIdBoleta)) IS NULL THEN 1 ELSE (ROW_NUMBER() OVER(ORDER BY NIdBoleta)) END),6)
					) NuevoFolio,
					(ROW_NUMBER() OVER(ORDER BY NIdBoleta))Consecutivo
				FROM Boletas 
				WHERE 
					NIdSucursal=@Sucursal AND
					CONVERT(INT,YEAR(DEmpeno))=@Anio 
				ORDER BY 
					NIdSucursal,YEAR(DEmpeno),NIdBoleta
				UPDATE 
					Boletas
				SET 
					Boletas.VFolio=#TEMPORAL.NuevoFolio
				FROM 
					#TEMPORAL
				WHERE 
					Boletas.NIdBoleta =#TEMPORAL.NIdBoleta AND 
					Boletas.NIdSucursal=#TEMPORAL.NIdSucursal
				DROP TABLE #TEMPORAL
				FETCH NEXT FROM Cursor1 
					INTO @Sucursal , @Anio 
				
			END 
	CLOSE Cursor1 
	DEALLOCATE Cursor1 
	SELECT 
		NIdSucursal,YEAR(DEmpeno),NIdBoleta,VFolio
	FROM 
		Boletas 
	ORDER BY 
		NIdSucursal,YEAR(DEmpeno),NIdBoleta

ROLLBACK TRAN