none
SQL Stored procedure ejecución en ETL RRS feed

  • Pregunta

  • Hola a todos.

    Tengo un SP que se ejecutan con una sola variable, como puedo hacer que esta variable me la solicite cuando ejecuto el SP sin tener que escribirla al momento de ejecución?

    exec  dbo.SPETL_Ind_Rev 201812

    ALTER PROCEDURE [dbo].[SPETL_Ind_Rev] (@monthid INT OUTPUT)
    AS
    /*Definicion de Variables*/
    DECLARE @bodyQuery1 AS VARCHAR(MAX)
    DECLARE @bodyQuery2 AS VARCHAR(MAX)
    DECLARE @bodyQuery3 AS VARCHAR(MAX)
    DECLARE @bodyQuery4 AS VARCHAR(MAX)
    DECLARE @bodyQuery5 AS VARCHAR(MAX)

    DECLARE @dimTiempo AS VARCHAR(MAX)
    DECLARE @QUERY_MDX AS VARCHAR(MAX)
    DECLARE @dimCompa AS VARCHAR(MAX)
    DECLARE @dimVersion AS VARCHAR(MAX)

    /*Se consultan por separado los datos del tiempo,compañia y version*/
    SET @dimTiempo = [dbo].[GET_DIM_TIEMPO](@monthid)
    SET @dimVersion = [dbo].[GET_Version_Cubo](@monthid)
    SET @bodyQuery1 ='
    SELECT

    SUBSTRING(CAST([[Compañia]].[Compañias]].[PK COMPA]].[MEMBER_CAPTION]]] AS VARCHAR(100)),8,100) COMPANIA,
    CONCAT(SUBSTRING(CAST([[Compañia]].[Compañias]].[PK COMPA]].[MEMBER_CAPTION]]] AS VARCHAR(100)),2,4),SUBSTRING(CAST([[Compañia]].[Compañias]].[PK COMPA]].[MEMBER_CAPTION]]] AS VARCHAR(100)),1,1)) PK_COMPA,
    CAST(CAST([[Cuentas]].[Cuenta]].[NIVEL 0]].&[800000000]].&[003_ETAPAGL_L1]].&[003_INDREL_L2]].&[003_G_INCOB_L3]]] AS FLOAT) AS NUMERIC(21,2)) BASE_INVERSION,
    CAST(CAST([[Cuentas]].[Cuenta]].[NIVEL 0]].&[800000000]].&[003_ETAPAGL_L1]].&[003_INDREL_L2]].&[005_ICMS_L3]]] AS FLOAT) AS NUMERIC(21,2)) LIQUIDEZ,
    CAST(CAST([[Cuentas]].[Cuenta]].[NIVEL 0]].&[800000000]].&[003_ETAPAGL_L1]].&[003_INDREL_L2]].&[006_ICMPR_L3]]] AS FLOAT) AS NUMERIC(21,2)) CAPITAL_PAGADO,
    CAST(CAST([[Cuentas]].[Cuenta]].[NIVEL 0]].&[800000000]].&[003_ETAPAGL_L1]].&[003_INDREL_L2]].&[004_ICIRRCP_L3]]] AS FLOAT) AS NUMERIC(21,2)) INDICE_LIQUIDEZ

    FROM  OPENQUERY(SIE_LINK_SERVER_PIII,
    ''
    SELECT
    Non Empty {[Cuentas].[Cuenta].[NIVEL 0].&[800000000].&[003_ETAPAGL_L1].&[003_INDREL_L2].&[003_G_INCOB_L3],
    [Cuentas].[Cuenta].[NIVEL 0].&[800000000].&[003_ETAPAGL_L1].&[003_INDREL_L2].&[005_ICMS_L3],
    [Cuentas].[Cuenta].[NIVEL 0].&[800000000].&[003_ETAPAGL_L1].&[003_INDREL_L2].&[006_ICMPR_L3],
    [Cuentas].[Cuenta].[NIVEL 0].&[800000000].&[003_ETAPAGL_L1].&[003_INDREL_L2].&[004_ICIRRCP_L3]} On Columns,
     Non Empty  AddCalculatedMembers ( {Descendants([Compañia].[Compañias].[GRUPO TIP COMPA].&[Sector Asegurador y Afianzador],255,LEAVES)} )  On Rows From [CNSF] Where (
    [Moneda].[Moneda].&[0],[Metodo Acumulacion].[MA ID].&[1],
    [Operaciones-Ramos].[Operaciones-Ramos].[TOTAL OPERACION].&[0]'

    SET @bodyQuery2 =','
    SET @bodyQuery3 =') Cell Properties VALUE'')'

    SET @QUERY_MDX = @bodyQuery1 + @dimVersion + @bodyQuery2 + @dimTiempo + @bodyQuery3

    EXECUTE (@QUERY_MDX)

    Saludos, espero alguien me pueda ayudar con esto.


    Mgm


    • Editado Slafco jueves, 4 de julio de 2019 15:58
    martes, 2 de julio de 2019 17:04

Respuestas

  • Debajo te pongo la captura de cómo llamar al procedimiento desde el Task de Execute SQL. El truco es poner en la sentencia únicamente el nombre del procedimiento almacenado, sin exec y sin parámetro. En "IsQueryStoredProcedure" se pone True. Y en los Mappings se mapea el parámetro del procedimiento al parámetro del package.

    Captura 1


    Captura 2

    • Editado Alberto PoblacionMVP miércoles, 3 de julio de 2019 21:11
    • Marcado como respuesta Slafco miércoles, 3 de julio de 2019 22:40
    miércoles, 3 de julio de 2019 21:10

Todas las respuestas

  •  como puedo hacer que esta variable me la solicite cuando ejecuto el SP

    Un SP no puede "solicitar" nada. El SP es algo completamente pasivo, interno del servidor, sin ninguna conexión con ninguna interfaz de usuario donde se pueda solicitar algo.

    Así que cualquier cosa que quieras solicitar, tiene que solicitarla el programa cliente que hace la llamada al SP. Para cuando llegue la llamada al SP, el SP tiene que encontrárselo todo ya resuelto.

    martes, 2 de julio de 2019 20:05
  • Hola

    De verdad que no sabia que si tenia un SP con una variable para su ejecución en SQL, al momento de ejecutar el SP en un ETL de SSIS data tools esta variable no podría hacerla que fuera captura al momento de Iniciar la tarea de ejecución y que lanzara una ventana para la captura de dicha variable a fin de capturar el trimestre deseado.

    Supongo que la variable o parámetro lo tendría que dejar fijo.

    Gracias.


    Mgm

    martes, 2 de julio de 2019 21:35
  • Ah, un momento, eso es otra cosa. El procedimiento almacenado no puede pedir la variable. Pero SSIS sí que puede. Donde yo te dije que "...tiene que solicitarla el programa cliente que hace la llamada al SP", en este caso ese programa cliente es SSIS.

    Depende de cómo lances el paquete de SSIS, pero si es un SQL Server "reciente" y tienes el paquete montado en el "Integration Services Catalog". Ahí le creas un Environment y defines variables. Estas son variables de SSIS, y SSIS se las puede pasar a los procedimientos que invoque. La forma de introducir los valores las variables depende de cómo lances el paquete, pero en general todas las opciones para lanzarlo disponen de alguna opción para pasarlas.

    miércoles, 3 de julio de 2019 5:48
  • Hola Alberto.

    Realmente soy nuevo en el SSIS con ETL pero con lo que me haz respondido, me ha dado idea de como desarrollar lo que necesito y también lo que tengo que buscar.

    Ahora el SP  SPETL_Ind con la variable tipo INT '201903' estoy ejecutando con una Tarea de Ejecutar SQL, pero no entiendo como esta variable ingresarla como paramatro del proyecto y que pueda ser utilizada al momento de la ejecución del SP.

    Es posible esto? se un parámetro fijo o como yo decía que fuera capturado al momento de ejecutar la tarea?

    Saludos.


    Mgm

    miércoles, 3 de julio de 2019 15:55
  • Bien, vayamos por partes. ¿Desde dónde, o de qué manera, lanzas el paquete SSIS? Lo digo porque una vez desplegado en producción el encargado de hacerte esa pregunta es el mecanismo que lanza el paquete de SSIS. Por ejemplo, si lo lanzas desde una línea de comandos usando dtexec, la variable se escribiría en esa línea de comando. O si lo ejecutas con el dtexecui, es el dtexecui el que te pedirá la variable. O si lo lanzas desde la rama "Integration services" en SSMS, entonces te lo pedirá el SSMS. Si lo lanzas desde un Job del Agente, olvídalo, entonces no tiene posibilidad de interactuar con el usuario.
    miércoles, 3 de julio de 2019 17:15
  • EL SP lo estoy mandando a llamar desde el SSIS con una tarea de ejecución de SQL y en el apartado de SQLStatement escribo la consulta de la siguiente manera : exec  dbo.SPETL_Ind_Rev 201812

    Pero lo que quiero es que ese parámetro '201812' lo puede agregar como un parámetro de proyecto y asignarlo a la consulta en el SQLStatement. Probé es agregar el parámetro en parámetros del proyecto

    Y en vez de meterlo en el SQLStatemente lo agrego como una expresión en la tarea de ejecutar SQL así: "exec  dbo.SPETL_Ind_Rev @[$Project::monthid] ?"

    Pero no logra ejecutar el SP.


    Mgm


    • Editado Slafco miércoles, 3 de julio de 2019 18:39
    miércoles, 3 de julio de 2019 18:38
  • Debajo te pongo la captura de cómo llamar al procedimiento desde el Task de Execute SQL. El truco es poner en la sentencia únicamente el nombre del procedimiento almacenado, sin exec y sin parámetro. En "IsQueryStoredProcedure" se pone True. Y en los Mappings se mapea el parámetro del procedimiento al parámetro del package.

    Captura 1


    Captura 2

    • Editado Alberto PoblacionMVP miércoles, 3 de julio de 2019 21:11
    • Marcado como respuesta Slafco miércoles, 3 de julio de 2019 22:40
    miércoles, 3 de julio de 2019 21:10
  • Solo dos detalle no tengo activada la casilla de IsQueryStoredProcedure  y creo es por el tipo de conexión de OLE BD, y en la imagen es ADO.NET eso es posible teniendo yo mi SP en SQL Server Management Studio? 

    y el parámetro 201803 que es tipo INT de mi SP dbo.SPETL_Ind_Rev se debe generar el parámetros del proyecto o dentro del Editor de tareas ejecutar SQL en la asignación de parámetros?


    Mgm


    • Editado Slafco miércoles, 3 de julio de 2019 22:01
    miércoles, 3 de julio de 2019 21:58
  • Listo¡ ha funcionado¡¡

    Ahora quise hacer que el SQLStatement hiciera un INSERT INTO TEMPORAL_IND dbo.SPETL_Ind_Rev y no se deja

    esto en el SQL funciona aquí debería funcionar igual o no?


    Mgm

    miércoles, 3 de julio de 2019 22:40
  • hacer que el SQLStatement hiciera un INSERT INTO TEMPORAL_IND dbo.SPETL_Ind_Rev

    Falta algo en esa INSERT. Tiene que ser una sentencia completa. Por ejemplo, si pones "INSERT INTO TEMPORAL_IND dbo.SPETL_Ind_Rev SELECT * FROM OtraTabla" entonces eso tiene que funcionar. No hay más que meter el texto dentro del "Execute SQL Task", y en este caso NO hay que poner true en el IsQueryStoredProcedure.
    jueves, 4 de julio de 2019 6:27
  • Listo¡

    A quedado la ejecución del SP y insertado de datos con la ejecución del mismo, dejo la configuración y pasos que hice realice:

    1. PARAMETRO - Dentro de los parámetros del proyecto se genero un parámetro esto para próximas paquetes que requieran utilizar este mismo parámetro:

    2. EDITOR DE LA TAREA EJECUTAR SQL -  Conexión Type: OLE BD, SQLSourceType: Entreada directa,SQLStatement:  INSERT INTO TEMPORAL_IND exec  dbo.SPETL_Ind_Rev ?, IsQueryStoredProcedure: Falso. Y en la aseginación de parámetros tomo el parámetro del proyecto y le asigno un tipo de dato de acuerdo al que se requiera.

    Gracias Alberto.


    Mgm

    jueves, 4 de julio de 2019 15:55