none
Usando variáveis no integration service RRS feed

  • Pergunta

  • Criei um sequence container para direcionar o meu processamento. Criei uma variável e uso a expressão @[User::_val] == "nao" ou @[User::_val] == "sim" para direcionar o fluxo. Só que não estou conseguindo atribuir um valor para a variável. Faço um select no banco e dependendo do result set preciso atribuir sim ou não para a variável. Como fazer isto?

    terça-feira, 23 de fevereiro de 2010 12:50

Todas as Respostas

  • Rosa,

    Você deve declarar a sua variável dentro da sua query, atribuindo os valores que estão sendo gerados durante o processamento da query.
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    terça-feira, 23 de fevereiro de 2010 16:48
    Moderador
  • Boa Tarde,

    Você terá que utilizar uma tarefa Execute SQL Task.
    Na guia Parameter Mapping faça a associação com o resultado da consulta e sua variável.

    [ ]s,

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

    O cálculo do uptime, do downtime e da disponibilidade em T-SQL
    http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!952.entry


    Classifique as respostas. O seu feedback é imprescindível
    terça-feira, 23 de fevereiro de 2010 17:12
  • Maia,

    Muito bem lembrado, esqueci de falar sobre o Execute SQL Task!!!!
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quarta-feira, 24 de fevereiro de 2010 11:44
    Moderador
  • deixa eu ver se entendi:

    vc quer fazer um select no banco e o resultado armazenar numa variavel?

    se for isso basta fazer o select no SQLStatement, ainda na guia general configurar a propriedade ResultSet para Single row e na guia Result Set add sua varial, sendo ela unica ou a primeira variavel coloque o valor 0 no Result name.

    quarta-feira, 7 de abril de 2010 19:03
  • Senhores,

    Boa Tarde, Tentei utilizar conforme resposta acima, porém ao tentar ver se houve alteração no valor da variável na guia de variáveis, esta permanece com valor inalterado. Isto é normal? o que pode ter ocorrido?

    Só recaptulando:

    Usei como teste um SQL Statement: SELECT 1 AS Count_Registros

    coloquei o ResultSet como: Linha Simples

    na guia resultset: Selecionei no campo Nome da Variável a minha variável User::Count_Registros e no resultname coloquei o número 0.

     

    Desde já Grato,

    Marco A. Oliveira

    segunda-feira, 12 de abril de 2010 18:50
  • Marco, vc verificou o escopo da variável? Verificou o valor da variável em tempo de execução? E qual é o tipo da variável criada ... Boolean, String, Integer?
    Wyllian de Lima - Se a resposta ajudou vote como útil !
    terça-feira, 13 de abril de 2010 12:37
  • Reforçando a mensagem do Wyllian, o valor da variavel só muda em tempo de execução.

    Finalizada a execução a variavel voltar ao seu valor default.

    terça-feira, 13 de abril de 2010 14:44
  • Senhores,

    Assim que rodo o pacote e seus steps estão em verde apresentando sucesso, chamo a lista de variáveis, e vejo que estão inalteradas. Esta Variável está definida como Int32.

    Só pra saberem um pouco mais da história, sempre usei DTS, estou tentando recriar um processo em um novo servidor usando o SSIS, o que posso estar fazendo de errado?

    Outra Observação... neste pacote tenho uma tarefa de Script que altera algumas variáveis... e elas também se apresentam inalteradas...

    Segue script para análise:

     Dts.Variables["Count_Insert"].Value = 0;
                Dts.Variables["Count_Update"].Value = 0;
                Dts.Variables["Count_Registros"].Value = 0;
                Dts.Variables["Count_Join"].Value = 0;
                Dts.Variables["Count_Join_Insert"].Value = 0;
                Dts.Variables["Count_Join_Update"].Value = 0;
               
                Dts.Variables["Email_Mensagem"].Value = "";
                Dts.Variables["Email_Assunto"].Value = "Importacao do Arquivo XXXX";
                Dts.Variables["Email_Para"].Value = "###Endereço de Email###";
                Dts.Variables["Email_Copia"].Value = "###Endereço de Email###";

                Dts.Variables["SQL_Erro"].Value = 0;

                Dts.Variables["Importacao_Result"].Value = 1;

                Dts.Variables["Arq_Caminho"].Value = @"###Endereço de Pasta###";
                Dts.Variables["Arq_Nome"].Value = "XXX.gz";

                Dts.Variables["Arq_TXT"].Value = Dts.Variables["Arq_Caminho"].Value + "_DET.TXT";

                Dts.Variables["Arq_LOG"].Value = Dts.Variables["Arq_TXT"].Value + ".log";

                Dts.Variables["CMD_Tira_Header"].Value = @"###Endereço de um arquivo####";
                Dts.Variables["Argumentos_Tira_Header"].Value = @"###Comando####"; ###Argumento### 1 1";

                Dts.Variables["CMD_Del_TXT"].Value = "CMD /c DEL " + Dts.Variables["Arq_TXT"].Value + " /q";

    Novamente Grato,
    Marco A. Oliveira

    terça-feira, 13 de abril de 2010 17:47
  • Marco já tenho uma suspeita do problema ... mas antes de sair escrevendo um monte de "groselha", te faço duas perguntas!

    Quando vc diz "Lista de variáveis" vc se refere o lugar onde criamos as variáveis?
    E por acaso vc testou o pacote criado e verificou se ele fez o que tinha que fazer?


    Wyllian de Lima - Se a resposta ajudou vote como útil !
    quarta-feira, 14 de abril de 2010 13:29
  • Wyllian,

    Sim, a lista de variáveis que menciono é onde criamos as variáveis.

    E não... o pacote não faz o que deveria: Por exemplo:

    O primeiro passo dele possui o script que coloquei acima e se coloco um break-point dentro dele vejo que as variaveis se modificam, mas o segundo passo é uma tarefa Executar processo onde tento modificar os valores de "Executable" e "Arguments" e estes só pegam os valores que estão definidos como padrão na lista de variaveis, nunca o valor que estou tentando dar para elas no Script.

    Agradeço pela ajuda.

    Marco A. Oliveira

    quarta-feira, 14 de abril de 2010 14:54
  • Marco, o valor da variável sempre será o valor Default com o qual ele foi criado, esse é o motivo que faz o valor permanecer o mesmo após a execução do pacote. Porém este fato não prejudica a execução do pacote, pois as variáveis assumem um novo valor em tempo de execução.
    Como vc mesmo mencionou vc colocou um BreakPoint e viu a alteração das variáveis (o evento q eu uso é o OnPreExecute e OnPostExecute), aí sim vc vai ver a modificação dos valores em tempo de execução.
    Sobre "Executable" e "Arguments", no script que vc postou antes não há nenhuma linha com essas variáveis esse pode ser um dos motivos. Caso sejam variáveis de uma outra tarefa verifique o Scopo da variável e se vc passou esses valores no ReadWriteVariables.
    Aguardo retorno...
    Wyllian de Lima - Se a resposta ajudou vote como útil !
    • Sugerido como Resposta Marco LC terça-feira, 20 de abril de 2010 12:35
    quarta-feira, 14 de abril de 2010 16:55
  • Wyllian,

    Descobri o problema, realmente as variáveis estão sento atribuidas corretamente, porém a Tarefa para qual estou tentando atribuir os parâmetros dinamicamente pela variável "Executar Processo" exige um caminho válido para um arquivo executável e o Pacote verifica esse caminho antes de iniciar qualquer step, antes até de atribuir o valor para as variáveis no primeiro step qie era o script... por isso o erro. Neste meu caso não tenho necessidade de atribuir este valor no script, por isso coloquei ele direto como valor padtão e fincionou... as outros steps que usam variáveis estão ok...

     

    Obrigado a todos.

    • Sugerido como Resposta Marco LC terça-feira, 20 de abril de 2010 12:34
    terça-feira, 20 de abril de 2010 12:34
  • Que bom Marco. O SSIS faz ma validação do pacote antes da execução para saber se há algum erro e avisá-lo, mas isso pode gerar erros indesejados como esse que acompanhamos. Mas, tem uma propriedade do Control Flow que se chama DelayValidation que realiza essa validação em tempo de execução, ou seja, enquanto o padrão é validar tudo e depois executá-lo de fato essa propriedade faz com que seja validado o step corrente e executa e faz o mesmo para o restante. Isso ajuda caso tenhamos um caso parecido com o seu, onde um step depende do valor de uma variável que foi modificada em tempo de execução. Fica aí uma outra opção, boa sorte.
    Wyllian de Lima - Se a resposta ajudou vote como útil !
    • Sugerido como Resposta Marco LC terça-feira, 20 de abril de 2010 17:03
    terça-feira, 20 de abril de 2010 13:24