jueves, 21 de mayo de 2015

SQL - Ciclo While Reemplazo de un Cursor


 -------------------------------------------------------
 --Declaracion de variables necesarias para el ciclo
 -------------------------------------------------------
DECLARE @origen TINYINT ,
    @rut_origen INT ,
    @tipo_direccion TINYINT ,
    @direccion CHAR(70) ,
    @comuna SMALLINT ,
    @email CHAR(50) ,
    @telefono CHAR(25) ,
    @telefono2 CHAR(25) ,
    @fax CHAR(25) ,
    @estado TINYINT

 -----------------------------------
 --Declaro  temporal
 -----------------------------------
CREATE TABLE #direccionesTemp
    (
      id INT IDENTITY(1, 1) ,
      cod_origen TINYINT,
      rut_origen INT ,
      cod_tipo_direccion TINYINT ,
      direccion CHAR(255) ,
      comuna SMALLINT ,
      telefono CHAR(12) ,
      estado TINYINT
    )
         
CREATE INDEX I_direcciones_temp  --El Indice es para aportar velocidad
ON #direccionesTemp(id) ;
 -----------------------------------
 --Lleno tabla temporal
 -----------------------------------
INSERT  INTO #direccionesTemp
        SELECT  cod_origen ,
                rut_origen ,
                cod_tipo_direccion ,
                direccion ,
                comuna ,          
                telefono ,          
                estado
        FROM    dbo.direcciones
                   
 ----------------------------------------
 --Variables de Recorrido
 ----------------------------------------
DECLARE @numeroDeRegistros INT
SET @numeroDeRegistros = ( SELECT   COUNT(*)
                           FROM     #direccionesTemp
                         )
DECLARE @recorridoWhile INT
SET @recorridoWhile = 1

 -----------------------------------------
 --recorrido
 -----------------------------------------
WHILE ( @numeroDeRegistros > 0    --mientras,el numero de registros sea mayor a 0
        AND @recorridoWhile <= @numeroDeRegistros  --y mientras la variable de recorrido sea menor o igual a la cantidad de registros
   
      )
    BEGIN        
        --lleno mis variables
        SELECT  @origen = cod_origen ,
                @rut_origen = rut_origen ,
                @tipo_direccion = cod_tipo_direccion ,
                @direccion = direccion ,
                @comuna = comuna ,
                @telefono = telefono ,                        
                @estado = ISNULL(estado,0)
        FROM    #direccionesTemp
        WHERE   id = @recorridoWhile    --las lleno con la data de la fila que voy recorriendo.
   
   
        BEGIN TRANSACTION
         BEGIN TRY
         INSERT INTO leasecom..t_clientes_direccion
                ( cod_origen ,
                  rut ,
                  tipo_direccion ,
                  correlativo ,
                  direccion ,
                  cod_comuna ,
                  email ,
                  telefono ,            
                  estado
                )
        VALUES  ( @origen ,
                  @rut_origen ,
                  @tipo_direccion ,
                  @correlativo ,
                  SUBSTRING(LTRIM(RTRIM(@direccion)), 1, 40) ,
                  @comuna , -- cod_comuna - smallint
                  NULL , -- email - varchar(255)
                  SUBSTRING(LTRIM(RTRIM(@telefono)), 1, 12)   ,            
                  @estado -- estado - tinyint
                )
   
        COMMIT TRANSACTION
         END TRY
        BEGIN CATCH
         SELECT ERROR_NUMBER() as ErrorNumber, ERROR_MESSAGE() as ErrorMessage;
         ROLLBACK TRANSACTION    
        END CATCH    
         
        SET @recorridoWhile = @recorridoWhile + 1
        --Print para indicar en que parte del recorrido va (Opcional).
        PRINT CONVERT(VARCHAR(100), @recorridoWhile )
    END

 DROP TABLE #direccionesTemp



2 comentarios: