none
Passagem de valores entre SQL Task (MSIS) RRS feed

  • Pergunta

  • Olá.

     

    Boa Tarde.

    Esse é o meu primeiro post por aqui.

    Estou fazendo um projeto com o Microsft SQL Integration Services e gostaria de saber como eu posso passar valor de uma instrução SQL executada dentro de uma "Execute SQL Task" para outra instrução.

     

    Por exemplo, dentro de uma "Execute SQL Task" tenho uma instrução SQL que insere uma linha na tabela e pega o @@IDENTITY dessa operação, no próximo passo, necessito dessa informação do @@IDENTITY.

     

    Obrigado.

     

     

    quarta-feira, 26 de setembro de 2007 21:31

Todas as Respostas

  • Olá,

    - Crie uma procedure que faz a inserceção e no final da procedure faça um select @@identity.

    - No seu pacote do SSIS clique em qualquer lugar com o botão direito e selecione a opção "Variables"

    - Adicione uma variável chamada ID e defina o tipo dela para int32 na janela de propriedades

    - Crie um Execute SQL Task e chame a sua procedure da seguinte forma:

    Code Block

    EXEC ?=SPR_SuaProcedure parametro1, paramreto2

     

     

    - Na aba "Parameter Mapping"...

    1) Adicione um mapeamento para a variavel User::ID.

    2) Selecione ReturnValeu na coluna Direction.

    3) Em Data Type selecione Int32

    4) Paramerter Name = 0

     

     

    O valor retornado será salvo na sua variável ID no escopo do pacote.

     

    Informações: http://technet.microsoft.com/en-us/library/ms141003.aspx

     

    Abraço

    quinta-feira, 27 de setembro de 2007 14:14
  •  

    Olá Lucas, Obrigado pela resposta mas infelizmente não funcionou

     

    Criei a proc

     

    Code Block

    Create Procedure sp_teste

    as

    begin

    Insert Into Log_DTS (Nm_Dts, Nm_Tabela, Visao, Dta_Inicio, Dta_Fim, Duracao, Qtd_Inseridas, Cod_Erro, Dsc_Erro, Sucesso)

    Values ('UNIDADENEGOCIO','UNIDADENEGOCIO', 'CFM', GetDate(), Null, Null,0, 0, '', 0)

    Select @@Identity

    end

     

     

     

    Fiz a variavel.

     

    Fiz a chamada da proc

     

    Fiz o parameter mapping

     

    E mesmo assim retornou o seguinte erro:

    Code Block

     

    [Execute SQL Task] Error: Executing the query "Exec ?=sp_teste" failed with the following error: "Invalid parameter number". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.

     

     

    Ps.: Sem o mapeamento de parametro e com o query statment somente Exec = sp_teste, funciona, logo não acho que seja problema de conexão.

     

    E depois no próximo step, em um outro Execute SQL Task, como faço para pegar esses valores?

     

    Se poder responder ficarei muito grato.

     

    Obrigado.

    quinta-feira, 27 de setembro de 2007 14:51
  • O tipo da váriavel com o tipo retornado não confere.

     

    Faz assim... Ex.:

     

    Em Parameter Mapping selecione a opção OUTPUT em Direction.

     

    Code Block

    EXEC spr_teste ? output

     

    CREATE PROCEDURE spr_teste @ID INT OUTPUT AS

    BEGIN

    SET NOCOUNT ON;

    SELECT @ID=1

    END

     

     

    Testei aqui e funcionou

    Abraço

    quinta-feira, 27 de setembro de 2007 20:08
  • Lucas ou quem pode me ajudar , tudo bom ?


    Eu aproveitei o  exemplo acima para tirara dúvidas.

    Preciso receber tres variaves output de minha procedure:

    Só que não estou tendo sucesso.


      Exemplo:

    No Management Studio  executo da seguinte forma:

       DECLARE @Desc_Stages_Zeradas Varchar(4000)
            DECLARE @StgZerada char(1)
            DECLARE @GeraRel char(1)

     exec prc_consistencia_stage_zeradas_bi  @Desc_Stages_Zeradas output ,
                                        @StgZerada output ,
                                        @GeraRel output


    Ai recebe os valores das variaveis na boa. Agora preciso ter o mesmo resultado no SSIS.



    ----------------------------

    Eu criei as variaveis no SSIS da seguinte forma scopo de package:


    Desc_Stages_Zeradas   String
    GeraRel                          char
    StgZerada                      char




    Criei um objeto Script SQL Task e no Code block coloquei:

    EXEC  prc_consistencia_stage_zeradas_bi  ? output ,? output , ? output


    No Parameter Mapping criei da seguinte forma:

    opção OUTPUT para Direction.

    Variavel                           DataType     Parameter Name   Tamanho
    ----------------------------------------------------------------------------------------------
    Desc_Stages_Zeradas   Varchar                        0              4000 
    GeraRel                          Varchar                        0                  1
    StgZerada                      Varchar                        0                  1



    Eu acho que estou errando na hora de chamar a procedure no Code Block:

    EXEC  prc_consistencia_stage_zeradas_bi  ? output ,? output , ? output


    Como passo os parâmetros para receber os três outputs nas variáveis criadas ?


    Pois depois vou fazer uma consistencia nas variaveis:  Exemplo:


    if
    GeraRel = 1
       chamo pacote Geração de Stg_Relatorios

    if StgZerada = 1
       disparo e-mail

    etc......


    Não sei se ficou bem claro. Minha principal dúvida é como trabalhar com procedure que recebe OUTPUT e depois eu posso trabalhar com os valores capturados nas variaveis do  SSIS para direcionar os controls flows.


    Obrigado...

    CODE BLOCK


    SSIS package "Package.dtsx" starting.
    Error: 0xC002F210 at Execute SQL Task, Execute SQL Task: Executing the query "
    EXEC  prc_consistencia_stage_zeradas_bi  ? output,? output,? output" failed with the following error: "Value does not fall within the expected range.". Possible failure reasons: Problems with the query, "ResultSet" property not set correctly, parameters not set correctly, or connection not established correctly.
    Task failed: Execute SQL Task
    SSIS package "Package.dtsx" finished: Success.
















    Savoir Vivre
    terça-feira, 10 de fevereiro de 2009 16:56
  • AMIGOS,

    Depois de stressar em testes, verifiquei que preciso rodar atualizações do Integration Services  aqui na minha maquina. Pois tava dando inconsistencia de data types.


    bom, agora funcionou.


    Bom, agora como leio a variavel capturada ?

    Exemplo :

    if GeraRel = 1
       chamo pacote Geração de Stg_Relatorios

    if StgZerada = 1
       disparo e-mail com as stages que stão zeradas que vai o valor da variavel Desc_Stages_Zeradas




    Bom, que puder me ajudar. agradeço.


    Obrigado !




    Savoir Vivre
    terça-feira, 10 de fevereiro de 2009 18:22
  • Boa Tarde,

    Qual tarefa deverá ler a variável para tomar a decisão ? É no Control Flow ?

    [ ]s,

    Gustavo Maia Aguiar
    http://gustavomaiaaguiar.spaces.live.com

    Importe arquivos XML com o CLR
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!346.entry


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 10 de fevereiro de 2009 18:35
  • Gustavo , sim é no control Flow.

    Exemplo:

    Após finalizar o Execute  Script Task eu tome a decisão.


    if GeraRel = 1
       Executo um Data Flow  com os relatórios

    if StgZerada = 1
       disparo e-mail com o objeto Send Mail informando no Texto do email o  valor da variavel Desc_Stages_Zeradas


    if GeraRel = 0

    disparo e-mail com o objeto Send Mail informando no Texto do email o  valor da variavel Desc_Stages_Zeradas


    So preciso saber como e onde faço essa lógica aqui no SSIS.


    Obrigado !



    Savoir Vivre
    terça-feira, 10 de fevereiro de 2009 19:16
  • Amigos, consegui achar a solução. Dei uma lida la No HelpOnLine via Web e realmente lá tem tudo. Só preciso aprender a trabalhar mais com ele.


    Para aqueles que querem ler uma variável no Control Flow  após a execução de uma tarefa segue o que eu fiz.


    1- Após terminar a tarefa eu criei um objeto Script Task.
    2- Cliquei em Edit e na opção Script propriedade ReadOnlyVariable eu coloquei a variável que eu quero testar no meu caso GeraRel.StgZerada (N's variaveis separe com COMMA)

    3-  Logo abaixo, cliquei no  botão Script Design e entrei com o  seguinte código:

    Public Sub Main()

            Dim geraRel As Long
            Dim ScriptResults As DTSExecResult

           
            If Dts.Variables.Contains("GeraRel") = True Then
                geraRel = CLng(Dts.Variables("GeraRel").Value)
            End If


            If geraRel = 1 Then
                Dts.TaskResult = ScriptResults.Success
            Else
                Dts.TaskResult = ScriptResults.Failure
            End If

        End Sub


    Segue o link: http://msdn.microsoft.com/pt-br/library/ms135941.aspx


    Abs e obrigado !


    Joie.





    Savoir Vivre
    • Sugerido como Resposta KB2W quarta-feira, 11 de fevereiro de 2009 13:10
    quarta-feira, 11 de fevereiro de 2009 13:05