Inquiridor
Passagem de valores entre SQL Task (MSIS)

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.
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 BlockEXEC ?=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
-
Olá Lucas, Obrigado pela resposta mas infelizmente não funcionou
Criei a proc
Code BlockCreate
Procedure sp_testeas
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 @@Identityend
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.
-
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 BlockEXEC spr_teste ? output
CREATE
PROCEDURE spr_teste @ID INT OUTPUT ASBEGIN
SET NOCOUNT ON; SELECT @ID=1END
Testei aqui e funcionou
Abraço
-
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 -
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 -
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.comImporte arquivos XML com o CLR
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!346.entry
Classifique as respostas. O seu feedback é imprescindível -
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 -
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