Componente de script SSIS - Como modificar o Output0Buffer

10

Eu tenho um componente de script que aceita registros da tabela de banco de dados do SQL Azure. O script então chama um serviço da web, que retorna o número de registros com falha e êxito.

Para todos os registros, eu gostaria de adicionar o campo Status que tem "sucesso" ou "falha" e isso obtém saída do componente de script.

Em seguida, registro essas saídas em um arquivo de texto.

Problema: Não consigo adicionar status para cada registro de entrada, pois a chamada de serviço da Web ocorre apenas após a execução.

Eu tentei isso, mas ainda não funciona:

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
         listOfData.Add(new ClockData 
         {
             TimeClockID=Row.TimeClockID,
             PersonID=Row.EmployeeCode,
             LocationCode=Row.ClockInServiceContextID,
             ClockInDateTime=Row.ClockInDateTime,
             ClockOutDateTime=Row.ClockOutDateTime

         });
 }

 public override void CreateNewOutputRows()
 {
     MessageBox.Show("Test CreateNewOutputRows");
     MessageBox.Show(listOfData.Count.ToString());
     foreach (var item in listOfData)
     {
         Output0Buffer.AddRow();
         Output0Buffer.EmployeeCode = item.PersonID;
         MessageBox.Show(item.PersonID);
     }
 }
flybyte
fonte
11
Por que você não pode executar a chamada de serviço da Web durante as entradas do processo? Todos os dados já caíram no pipeline assim que saíram desse método. Você está acumulando dados na sua variável local, mas neste momento é como segurando uma foto de um carro que apenas foi embora, sim, isso é o que parecia, mas ele não vai voltar
billinkc
@ flybyte: algo útil na minha resposta?
Marian

Respostas:

6

Tudo em uma transformação é feito no Input0_ProcessInputRow. A solução seria essencialmente

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
         listOfData.Add(new ClockData 
         {
             TimeClockID=Row.TimeClockID,
             PersonID=Row.EmployeeCode,
             LocationCode=Row.ClockInServiceContextID,
             ClockInDateTime=Row.ClockInDateTime,
             ClockOutDateTime=Row.ClockOutDateTime
         });
         Output0Buffer.AddRow();
         Output0Buffer.EmployeeCode = item.PersonID;
         MessageBox.Show(item.PersonID);
}

Você pode executar as etapas de saída no PostExecute, CreateNewOutputRows não é executado na transformação, apenas nos scripts de destino.

JohnDavid
fonte
3

Não sou muito proficiente no SSIS, mas acho que você pode tentar as seguintes idéias:

  • vá para o componente de script e edite-o,
  • vá para a seção Entradas e saídas (3ª seção),
  • vá para Output0 - colunas de saída,
  • adicione uma nova coluna (dê um nome e tipo, digamos Status - booleano).

Em seguida, você terá a coluna vazia na sua saída e precisará preenchê-la com alguns dados para cada uma das linhas de entrada:

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
    Row.Status = IIf(String.IsNullOrEmpty(rowValues.GetValue(1).ToString()), 0, 1)

Isso ajudará você a adicionar uma coluna Status à sua tabela de saída. Espero que seja isso que você queria.

Marian
fonte