Componente script SSIS - Come modificare Output0Buffer


10

Ho un componente di script che accetta record dalla tabella del database SQL Azure. Lo script richiama quindi un servizio Web, che restituisce il numero di record non riusciti e di successo.

Per tutti i record, vorrei aggiungere il campo Stato che ha "successo" o "errore" e questo ottiene l'output dal componente script.

Quindi registro tali output in un file di testo.

Problema: non sono stato in grado di aggiungere lo stato per ciascun record di input poiché la chiamata al servizio Web avviene solo dopo l'esecuzione.

Ho provato questo ma ancora non funziona:

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);
     }
 }

1
Perché non è possibile eseguire la chiamata al servizio Web durante i processi di input? Tutti i dati sono già passati alla pipeline una volta usciti da quel metodo. Stai accumulando dati nella tua variabile locale ma a questo punto è come tenere una foto di un'auto che è appena andata via-sì, è così che sembrava ma non torna indietro
billinkc

@flybyte: qualcosa di utile nella mia risposta?
Marian,

Risposte:


6

Tutto in una trasformazione viene eseguito in Input0_ProcessInputRow La soluzione sarebbe essenzialmente

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);
}

Potresti essere in grado di eseguire i passaggi di output in PostExecute, CreateNewOutputRows non viene eseguito in Transformation, ma solo negli script di destinazione.


3

Non sono molto competente in SSIS, ma penso che potresti provare le seguenti idee:

  • vai al componente script e modificalo,
  • vai alla sezione Ingressi e uscite (3a sezione),
  • vai a Output0 - Colonne di output,
  • aggiungi una nuova colonna (dagli un nome e un tipo, diciamo Status - booleano).

Quindi avresti la colonna vuota nel tuo output e dovrai popolarla con alcuni dati per ciascuna delle righe di input:

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

Ciò ti aiuterà ad aggiungere una colonna Stato alla tabella di output. Spero che questo sia quello che volevi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.