Domanda

Ho tabelle ad albero, Customer, Invoice e InvoiceRow con le relazioni standard.

Questi devo esportare in un file di lunghezza di campo fisso con i primi due caratteri di ogni riga che identificano il tipo di riga. I tipi di riga hanno specifiche diverse.

Probabilmente potrei farlo con un ciclo nidificato in un blocco di script, ma questo è il mio primo pacchetto SSIS in assoluto e quella soluzione sembra sbagliata.

modifica:

L'output deve avere:

Customer  
Invoice  
Rows  
Customer  
Invoice  
Rows  
and so on
È stato utile?

Soluzione

Il tuo istinto di farlo usando un componente Destinazione script è corretto. Sfortunatamente, questo scenario non funziona bene con SSIS. Non lo considero un pacchetto per principianti. Se è necessario utilizzare SSIS, inizierei unendo tutti i dati interni in modo che vi sia una riga per ogni InvoiceRow, contenente i dati necessari da tutte e tre le tabelle.

CustomerCols, InvoiceCols, RowCols

Quindi, nel componente di destinazione dello script dovrai tenere traccia dei valori del cliente e della fattura, poiché cambiano dovrai scrivere righe extra nell'output.

Vedi Creazione di una destinazione con il componente Script per ulteriori informazioni sulla destinazione dello script.

La mia esperienza dimostra che le destinazioni degli script possono avere buone prestazioni.

Altri suggerimenti

Eviterei di scrivere Destinazione script e utilizzare solo Trasformazione script + Destinazione file flat. In questo modo, ti concentri sull'output logico (stringhe di dati), mentre permetti a SSIS di scrivere effettivamente sul file (potrebbe essere un po 'più efficiente, oltre a concentrarti sulla tua attività, non sulla scrittura su file).

Per prima cosa, devi ottenere dati denormalizzati. È possibile eseguire join e ordinamenti nel DBMS, ma se non si desidera esercitare troppa pressione sul DBMS, è sufficiente estrarre i dati ordinati e unirli utilizzando due trasformazioni SSIS Merge Join.

Quindi esegui lo script: continua a eseguire i valori del cliente e della fattura correnti, emettili quando cambiano, genera InvoiceRow su ogni input. Qualcosa del genere:

if (this.CustomerID != InputBuffer.CustomerID) {
  this.CustomerID = InputBuffer.CustomerID;
  OutputBuffer.AddRow();
  OutputBuffer.OutputColumn = "Customer: " + InputBuffer.CustomerID + " " + InputBuffer.CustomerName;
}
// repeat the same code for Invoice

OutputBuffer.AddRow();
OutputBuffer.OutputColumn = "InvoiceRow: " + InputBuffer.InvoiceRowPrice;

Infine, aggiungi una destinazione per file flat con una singola colonna (OutputColumn creata dallo script) per scrivere questo nel file.

Elabora le tue tre tabelle in modo che tutti gli output siano appropriati per il tuo file di output (incluso il designatore del tipo di riga). Dovrai eseguire questa operazione in tre percorsi di flusso separati nel flusso di dati, quindi riunire le righe in un elemento Flusso di dati All Union. Da lì, elaborali secondo necessità per creare il tuo file di output.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top