none
Store Procedure: Variables RRS feed

  • Pregunta

  • Hola¡

    Tengo un SP funcionando pero quiero optimizarlo logrando disminuir el numero de variables con el que se ejecuta de cuatro a una.

    ALTER PROCEDURE [dbo].[SPCopiaEtapasComentarios_Inpección] (@ANIO_PARTICION_INICIO INT,@ANIO_PARTICION_FIN INT,@MONTHID_INI INT,@MONTHID_FIN INT)
    AS
    BEGIN
    INSERT INTO [RR7].[dbo].[T_COMENTARIOS_INDICADORES]
    SELECT [NIVEL_4]
          ,@MONTHID_FIN AS [MONTHID] --'201903'
          ,[ID_COMPA]
          ,[FECHA_ULTIMA]
          ,[USUARIO]
          ,[TIPO_COMENTARIO]
          ,[COMENTARIO]
          ,[ETAPA]
          ,[RESPONSABLE]
          ,1 AS [VERSION_ID]  
    FROM  [RR7].[dbo].[T_COMENTARIOS_INDICADORES]
    WHERE VERSION_ID = 1
    AND MONTHID = @MONTHID_INI --'201812'
    AND [NIVEL_4] IN ('047_INSPFIN_L4','048_INSPTEC_L4') ;
    INSERT INTO [RR7].[dbo].[FACT_AUXILIAR]
    SELECT @ANIO_PARTICION_FIN AS [ANIO_PARTICION] ----'2019'
          ,1 AS [VERSION_ID]
          ,[ID_COMPA]
          ,@MONTHID_FIN AS [MONTHID] --'201903'
          ,[ID_NIVEL]
          ,[MONEDA]
          ,[IMPORTE]
          ,[ETAPA]
          ,[CALCULO]
          ,[PONDERADO]
          ,[ID_OPERACION]
          ,[MA_ID]
          ,[FECHA_CARGA]
    FROM  [RR7].[dbo].[FACT_AUXILIAR]
    WHERE VERSION_ID = 1
    AND MONTHID = @MONTHID_INI  --'201812'
    AND [ANIO_PARTICION] = @ANIO_PARTICION_INICIO --'2018'
    AND [ID_NIVEL] IN ('047_INSPFIN_L4','048_INSPTEC_L4') ;
    END

    Ejecución Actual DE: exec [dbo].[CopiaEtapasComentarios_Inpección] '2018','2019','201812','201903'  (4 Variables)

    A: exec [dbo].[CopiaEtapasComentarios_Inpección] '201903'  (1 Variable)

    Para ambas partes del SP se toma la información del Trimestre anterior y la copia al trimestre nuevo.

    La lógica es que de acuerdo al Trimestre que se capture en la variable sea: 201903,201906,201909 y 201912 las variables actuales que se tiene tomen el año (YYYY) y el año con el mes (YYYYMM).

    Espero me puedan ayudar o dar una idea de como puedo logar esto, saludos ¡


    Mgm


    • Editado Slafco viernes, 14 de junio de 2019 18:21
    viernes, 14 de junio de 2019 18:08

Respuestas

  • Hola Slafco:

    Entiendo que por optimización te refieres a enviar menos variables.

    Para tu escenario, lo mejor es trabajar con fechas.

    DECLARE @ANIO_PARTICION_INICIO INT ;
    DECLARE @ANIO_PARTICION_FIN INT;
    DECLARE @MONTHID_INI INT;
    DECLARE @MONTHID_FIN INT = 201903;
    /* si la entrada es 201903 */
    DECLARE @FECHA DATE = (CAST(CONCAT(CAST(@MONTHID_FIN AS VARCHAR(6)),'01') AS DATE));/* ULTIMO DIA DEL TRIMESTRE */
    SET @MONTHID_INI = (((YEAR(DATEADD(QUARTER,-1,@FECHA)))*100) + (MONTH(DATEADD(QUARTER,-1,@FECHA))))
    SET @ANIO_PARTICION_FIN = YEAR(@FECHA)
    SET @ANIO_PARTICION_INICIO = YEAR(@FECHA)-1;
    SELECT @ANIO_PARTICION_INICIO, @ANIO_PARTICION_FIN, @MONTHID_INI, @MONTHID_FIN
    
    

    Salida

    ALTER PROCEDURE [dbo].[SPCopiaEtapasComentarios_Inpección] (@MONTHID_FIN INT=0)
    AS
    BEGIN
    if (@MONTHID_FIN = 0)
    BEGIN 
        SET @MONTHID_FIN = YEAR(GETDATE())*100+MONTH(GETDATE())
    
    END
    
    DECLARE @FECHA DATE = EOMONTH(CAST(CONCAT(CAST(@MONTHID_FIN AS VARCHAR(6)),'01') AS DATe));/* ULTIMO DIA DEL TRIMESTRE */
    SET @MONTHID_INI = (((YEAR(DATEADD(QUARTER,-1,@FECHA)))*100) + (MONTH(DATEADD(QUARTER,-1,@FECHA))))
    SET @ANIO_PARTICION_FIN = YEAR(@FECHA)
    SET @ANIO_PARTICION_INICIO = YEAR(@FECHA)-1;
    
    INSERT INTO [RR7].[dbo].[T_COMENTARIOS_INDICADORES]
    SELECT [NIVEL_4]
          ,@MONTHID_FIN AS [MONTHID] --'201903'
          ,[ID_COMPA]
          ,[FECHA_ULTIMA]
          ,[USUARIO]
          ,[TIPO_COMENTARIO]
          ,[COMENTARIO]
          ,[ETAPA]
          ,[RESPONSABLE]
          ,1 AS [VERSION_ID]   
    FROM  [RR7].[dbo].[T_COMENTARIOS_INDICADORES] 
    WHERE VERSION_ID = 1
    AND MONTHID = @MONTHID_INI --'201812'
    AND [NIVEL_4] IN ('047_INSPFIN_L4','048_INSPTEC_L4') ;
    INSERT INTO [RR7].[dbo].[FACT_AUXILIAR]
    SELECT @ANIO_PARTICION_FIN AS [ANIO_PARTICION] ----'2019'
          ,1 AS [VERSION_ID]
          ,[ID_COMPA]
          ,@MONTHID_FIN AS [MONTHID] --'201903'
          ,[ID_NIVEL]
          ,[MONEDA]
          ,[IMPORTE]
          ,[ETAPA]
          ,[CALCULO]
          ,[PONDERADO]
          ,[ID_OPERACION]
          ,[MA_ID]
          ,[FECHA_CARGA]
    FROM  [RR7].[dbo].[FACT_AUXILIAR] 
    WHERE VERSION_ID = 1
    AND MONTHID = @MONTHID_INI  --'201812'
    AND [ANIO_PARTICION] = @ANIO_PARTICION_INICIO --'2018'
    AND [ID_NIVEL] IN ('047_INSPFIN_L4','048_INSPTEC_L4') ;
    END

    Fíjate que te he puesto el parámetro @MONTHID_FIN como opcional, ya que si quieres hacer el trimestre actual no se lo tienes ni que pasar. 

    Puedes consumirlo como

    exec dbo.[SPCopiaEtapasComentarios_Inpección]; 

    o

    exec dbo.[SPCopiaEtapasComentarios_Inpección] @MONTHID_FIN = 201906;

    o

    exec dbo.[SPCopiaEtapasComentarios_Inpección] 201906;

    Espero te ayude

    • Marcado como respuesta Slafco martes, 18 de junio de 2019 18:24
    sábado, 15 de junio de 2019 8:11

Todas las respuestas

  • Hola Slafco:

    Entiendo que por optimización te refieres a enviar menos variables.

    Para tu escenario, lo mejor es trabajar con fechas.

    DECLARE @ANIO_PARTICION_INICIO INT ;
    DECLARE @ANIO_PARTICION_FIN INT;
    DECLARE @MONTHID_INI INT;
    DECLARE @MONTHID_FIN INT = 201903;
    /* si la entrada es 201903 */
    DECLARE @FECHA DATE = (CAST(CONCAT(CAST(@MONTHID_FIN AS VARCHAR(6)),'01') AS DATE));/* ULTIMO DIA DEL TRIMESTRE */
    SET @MONTHID_INI = (((YEAR(DATEADD(QUARTER,-1,@FECHA)))*100) + (MONTH(DATEADD(QUARTER,-1,@FECHA))))
    SET @ANIO_PARTICION_FIN = YEAR(@FECHA)
    SET @ANIO_PARTICION_INICIO = YEAR(@FECHA)-1;
    SELECT @ANIO_PARTICION_INICIO, @ANIO_PARTICION_FIN, @MONTHID_INI, @MONTHID_FIN
    
    

    Salida

    ALTER PROCEDURE [dbo].[SPCopiaEtapasComentarios_Inpección] (@MONTHID_FIN INT=0)
    AS
    BEGIN
    if (@MONTHID_FIN = 0)
    BEGIN 
        SET @MONTHID_FIN = YEAR(GETDATE())*100+MONTH(GETDATE())
    
    END
    
    DECLARE @FECHA DATE = EOMONTH(CAST(CONCAT(CAST(@MONTHID_FIN AS VARCHAR(6)),'01') AS DATe));/* ULTIMO DIA DEL TRIMESTRE */
    SET @MONTHID_INI = (((YEAR(DATEADD(QUARTER,-1,@FECHA)))*100) + (MONTH(DATEADD(QUARTER,-1,@FECHA))))
    SET @ANIO_PARTICION_FIN = YEAR(@FECHA)
    SET @ANIO_PARTICION_INICIO = YEAR(@FECHA)-1;
    
    INSERT INTO [RR7].[dbo].[T_COMENTARIOS_INDICADORES]
    SELECT [NIVEL_4]
          ,@MONTHID_FIN AS [MONTHID] --'201903'
          ,[ID_COMPA]
          ,[FECHA_ULTIMA]
          ,[USUARIO]
          ,[TIPO_COMENTARIO]
          ,[COMENTARIO]
          ,[ETAPA]
          ,[RESPONSABLE]
          ,1 AS [VERSION_ID]   
    FROM  [RR7].[dbo].[T_COMENTARIOS_INDICADORES] 
    WHERE VERSION_ID = 1
    AND MONTHID = @MONTHID_INI --'201812'
    AND [NIVEL_4] IN ('047_INSPFIN_L4','048_INSPTEC_L4') ;
    INSERT INTO [RR7].[dbo].[FACT_AUXILIAR]
    SELECT @ANIO_PARTICION_FIN AS [ANIO_PARTICION] ----'2019'
          ,1 AS [VERSION_ID]
          ,[ID_COMPA]
          ,@MONTHID_FIN AS [MONTHID] --'201903'
          ,[ID_NIVEL]
          ,[MONEDA]
          ,[IMPORTE]
          ,[ETAPA]
          ,[CALCULO]
          ,[PONDERADO]
          ,[ID_OPERACION]
          ,[MA_ID]
          ,[FECHA_CARGA]
    FROM  [RR7].[dbo].[FACT_AUXILIAR] 
    WHERE VERSION_ID = 1
    AND MONTHID = @MONTHID_INI  --'201812'
    AND [ANIO_PARTICION] = @ANIO_PARTICION_INICIO --'2018'
    AND [ID_NIVEL] IN ('047_INSPFIN_L4','048_INSPTEC_L4') ;
    END

    Fíjate que te he puesto el parámetro @MONTHID_FIN como opcional, ya que si quieres hacer el trimestre actual no se lo tienes ni que pasar. 

    Puedes consumirlo como

    exec dbo.[SPCopiaEtapasComentarios_Inpección]; 

    o

    exec dbo.[SPCopiaEtapasComentarios_Inpección] @MONTHID_FIN = 201906;

    o

    exec dbo.[SPCopiaEtapasComentarios_Inpección] 201906;

    Espero te ayude

    • Marcado como respuesta Slafco martes, 18 de junio de 2019 18:24
    sábado, 15 de junio de 2019 8:11
  • Justo lo que quería hacer, me tomo unos minutos revisar línea por línea para entender y ver que tienes razón en que el SP se puede ejecutar sin asignarle un valor a la variable si uno desea ejecutarlo al trimestre actual.

    Asi que lo deje de la siguiente manera ya con mis cometarios y también la declaración de las variables :

    DECLARE @MONTHID_INI INT
    DECLARE @ANIO_PARTICION_FIN INT
    DECLARE @ANIO_PARTICION_INICIO INT

    ALTER PROCEDURE [dbo].[SPCopiaEtapasComentarios_Inpección_MOD] (@MONTHID_FIN INT=0)

    ---------------------------------------------------/* FECHA ACTUAL (YYYYMM) */
     --SELECT YEAR(GETDATE())*100
     --SELECT MONTH(GETDATE())
     --SELECT YEAR(GETDATE())*100+MONTH(GETDATE())
    AS
    BEGIN
    if (@MONTHID_FIN = 0)
    BEGIN
        SET @MONTHID_FIN = YEAR(GETDATE())*100+MONTH(GETDATE())
    END
    ---------------------------------------------------/* ULTIMO DIA DEL TRIMESTRE ACTUAL (YYYY-MM-DD) */
     --DECLARE @MONTHID_FIN INT
     --SET @MONTHID_FIN = '201906'
     --SELECT DATE = EOMONTH(CAST(CONCAT(CAST(@MONTHID_FIN AS VARCHAR(6)),'01') AS DATe))

    ---------------------------------------------------/* TRIMESTRE ANTERIOR (YYYYMM) */
     --DECLARE @FECHA DATE
     --SET @FECHA = '2019-03-31'
     --SELECT (((YEAR(DATEADD(QUARTER,-1,@FECHA)))*100) + (MONTH(DATEADD(QUARTER,-1,@FECHA))))

    ---------------------------------------------------/*AÑO ACTUAL (YYYY) */
     --DECLARE @FECHA DATE
     --SET @FECHA = '2019-03-31'
     --SELECT  YEAR(@FECHA)
    ---------------------------------------------------/*AÑO ANTERIOR (YYYY) */
     --DECLARE @FECHA DATE
     --SET @FECHA = '2019-03-3'
     --SELECT YEAR(@FECHA)-1;

    DECLARE @MONTHID_INI INT
    DECLARE @ANIO_PARTICION_FIN INT
    DECLARE @ANIO_PARTICION_INICIO INT

    DECLARE @FECHA DATE = EOMONTH(CAST(CONCAT(CAST(@MONTHID_FIN AS VARCHAR(6)),'01') AS DATe));/* ULTIMO DIA DEL TRIMESTRE ACTUAL (YYYY-MM-DD) */
    SET @MONTHID_INI = (((YEAR(DATEADD(QUARTER,-1,@FECHA)))*100) + (MONTH(DATEADD(QUARTER,-1,@FECHA))))/* TRIMESTRE ANTERIOR (YYYYMM) */
    SET @ANIO_PARTICION_FIN = YEAR(@FECHA)/*AÑO ACTUAL (YYYY) */
    SET @ANIO_PARTICION_INICIO = YEAR(@FECHA)-1;/*AÑO ANTERIOR (YYYY) */

    INSERT INTO [RR7].[dbo].[T_COMENTARIOS_INDICADORES]
    SELECT [NIVEL_4]
          ,@MONTHID_FIN AS [MONTHID] --'201906'
          ,[ID_COMPA]
          ,[FECHA_ULTIMA]
          ,[USUARIO]
          ,[TIPO_COMENTARIO]
          ,[COMENTARIO]
          ,[ETAPA]
          ,[RESPONSABLE]
          ,1 AS [VERSION_ID]  
    FROM  [RR7].[dbo].[T_COMENTARIOS_INDICADORES]
    WHERE VERSION_ID = 1
    AND MONTHID = @MONTHID_INI --'201903'
    AND [NIVEL_4] IN ('047_INSPFIN_L4','048_INSPTEC_L4') ;
    INSERT INTO [RR7].[dbo].[FACT_AUXILIAR]
    SELECT @ANIO_PARTICION_FIN AS [ANIO_PARTICION] ----'2019'
          ,1 AS [VERSION_ID]
          ,[ID_COMPA]
          ,@MONTHID_FIN AS [MONTHID] --'201906'
          ,[ID_NIVEL]
          ,[MONEDA]
          ,[IMPORTE]
          ,[ETAPA]
          ,[CALCULO]
          ,[PONDERADO]
          ,[ID_OPERACION]
          ,[MA_ID]
          ,[FECHA_CARGA]
    FROM  [RR7].[dbo].[FACT_AUXILIAR]
    WHERE VERSION_ID = 1
    AND MONTHID = @MONTHID_INI  --'201903'
    AND [ANIO_PARTICION] = @ANIO_PARTICION_INICIO --'2019'
    AND [ID_NIVEL] IN ('047_INSPFIN_L4','048_INSPTEC_L4') ;
    END

    Que hacían falta para que funcionara¡

    Muchas gracias, Javier¡


    Mgm

    sábado, 15 de junio de 2019 16:20
  • De nada
    domingo, 16 de junio de 2019 6:00