Pergunta

Estou a migração de dados que tem de ser inserido usando procedimentos armazenados que já existem. Os procedimentos armazenados têm parâmetros e um valor de retorno (a partir de uma instrução SELECT) de um ID para a linha inserida. Dentro de uma DB Comando OLE no SSIS, eu posso chamar o procedimento armazenado passando valores de coluna como os parâmetros e eu costumo usar parâmetros de saída do procedimento armazenado para manusear "id" de saída; mas tenho certeza como isso pode ser tratado com valores de retorno quando o procedimento usa um select para retornar o valor id. Aqui está um exemplo do que eu usei antes que funciona, mas eu preciso pegar o valor retornado do select:

exec dbo.uspInsertContactAddress
@Address = ?,
@ContactID = ?,
@DeliveryMethodId = ?,
@ID = ? output,
@Version = ? output
Foi útil?

Solução

A maneira que eu descobri que eu poderia fazer isso que foi realmente muito simples:

exec ? = dbo.StoredProc @param = ?, @param2 = ?

e, em seguida, um @RETURN_VALUE aparecerão nas colunas de destino disponíveis

Outras dicas

Não use os nomes das variáveis ??na propriedade SqlCommand, apenas os pontos de interrogação e o "OUT" ou o rótulo "OUTPUT" para os parâmetros de saída.

O truque para pegar o valor do parâmetro de saída é colocar uma transformação coluna derivada na frente gasoduto do DB Comando OLE para introduzir uma coluna (mapeado para uma variável SSIS) para capturar o resultado do procedimento.

Transformação Veja OLEDB Comando E Colunas de identidade para uma visão boa com tampas de tela de como fazer isso. Veja também Trash Destino Adapter com o destino do lixo usado no primeiro link. É uma ferramenta útil para ter disponível para depuração coisas como esta.

Se o procedimento armazenado retorna um conjunto de resultados, então você precisa capturá-lo:

DECLARE @results TABLE (
    [ID] INT NOT NULL
)

INSERT @results ([ID])
EXEC dbo.uspInsertContactAddress @Address = ?, @ContactID = ?, @DeliveryMethodId = ?, @ID = ? output, @Version = ? output

SELECT * FROM @results 

Nota: Eu usei uma variável de tabela. Você pode precisar usar uma tabela temporária, dependendo da sua versão do SQL Server.

Eu sempre usei o mapeamento de parâmetros dentro da tarefa Executar SQL com um monte de sucesso. A instrução SQL é "EXEC nameofstoredproc?,? OUTPUT", com os pontos de interrogação especificar a localização dos parâmetros e OUTPUT se o parâmetro é uma saída.

Você especifica os parâmetros no mapeamento com o nome apropriado variável, direção (entrada, saída, ReturnValue) e tipo de dados. Desde o seu proc armazenado está retornando os dados que você quer através de um conjunto de resultados, em seguida, especificar a direção para as variáveis ??para recolher o ID e versão como ReturnValue. Ele deve funcionar muito bem para você.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top