2009-06-15 10 views
2

Une méthode intéressante, nous évaluons les outils ETL pour le pré-traitement des données de relevé (factures de services publics, relevés bancaires, etc.) pour l'impression.Données transactionnelles SSIS (différents types d'enregistrements, un fichier)

Certaines des données proviennent d'un seul fichier plat, avec différents types d'enregistrements.

par exemple. un type d'enregistrement avec "01" comme le premier champ sera des données d'adresse. Cela aura des champs de nom et d'adresse. Un type d'enregistrement avec "02" sera des données récapitulatives, avec des soldes et des totaux. Le type d'enregistrement "03" sera un élément de campagne sur la déclaration.

Chaque instruction aura un enregistrements 01 et 02 et plusieurs enregistrements 03. Je pourrais pré-analyser le fichier et le diviser en 3 fichiers pour le charger dans une table, mais ce n'est pas l'idéal.

Nous prenons le fichier et faisons quelques manipulations dessus (par exemple ajouter quelques champs à l'enregistrement d'adresse, et peut-être faire un total/validation), puis envoyer le fichier dans le même format (mais avec les champs supplémentaires ajoutés) à notre programme de composition d'impression.

Comment le feriez-vous dans SSIS?

Répondre

0

Ceci est possible, vous devrez écrire une logique personnalisée. Je l'ai fait une fois avec DTS. Si le fichier est délimité, SSIS importera les champs correctement. Vous pouvez écrire un script qui examine le champ de type d'enregistrement, puis branches dans différentes insertions en fonction du type d'enregistrement. Si le fichier a des enregistrements qui ne sont pas délimités, mais que chaque type a ses propres largeurs fixes, cela devient beaucoup plus compliqué, car vous devez analyser et diviser chaque ligne importée, avec les types d'enregistrement et leur largeur codés en dur dans le script .

+0

Pas besoin d'écrire des scripts personnalisés dans SSIS. La division conditionnelle est un processus simple si-alors qui nécessite seulement de la logique, pas de script. – Eric

+0

Que diriez-vous des fichiers à largeur fixe? Pouvez-vous supprimer une certaine position dans les données, par opposition à un nom de colonne? – cdonner

-1

Il y a plusieurs façons de le faire, mais je pense que le plus facile à comprendre serait d'ajouter un partage conditionnel après la tâche source, puis de le faire passer par un tas de tâches de conversion de données pour obtenir le bon format. Les données.

Assurez-vous que votre source est configurée avec les types de données corrects, donc rien ne passe (par exemple toutes les chaînes). Ensuite, il suffit de cocher le champ "Type d'enregistrement" dans cette division conditionnelle pour l'envoyer à la bonne branche.

+0

La façon conventionnelle de travailler avec les données source ne fonctionnera pas, puisque la source ne peut gérer qu'une seule mise en page. Voir la réponse de Cade. – Sam

5

Le gros problème avec les enregistrements de variantes dans SSIS est que vous n'obtenez aucun des avantages du gestionnaire de connexions pour aider à la mise en page, car le gestionnaire de connexions ne peut gérer qu'une seule mise en page. Donc typiquement, vous vous retrouvez avec un fichier plat CRLF terminé avec deux colonnes: type d'enregistrement et données d'enregistrement. Ensuite, vous mettez la division conditionnelle dans et analyser chaque type de ligne sur des chemins différents. L'analyse devra diviser les données d'enregistrement restantes et les placer dans des colonnes et les convertir normalement, soit avec une transformation de colonne dérivée, soit avec une transformation de script et des transformations de conversion potentielle.

Si vous aviez beaucoup de paquets à faire, j'envisagerais sérieusement d'écrire un composant personnalisé qui produirait 3 sorties déjà converties vers vos types de destination.

+0

Ne supposez pas qu'il existe des composants personnalisés génériques qui peuvent gérer ce genre de chose? , c'est-à-dire de spécifier le champ "type d'enregistrement" et les champs de sortie sans avoir à le coder? Sinon peut-être le temps de coder le mien! – Dane

+0

Pas que je sache. Si vous en trouvez un, retrouvez ma question sur les «meilleurs composants SSIS» et ajoutez-la ici. –

3

répondu à ma propre question - voir ci-dessous script. AcctNum vient d'une colonne dérivée de la source du fichier plat et sera correctement rempli pour 02 types d'enregistrement, enregistrez-le dans varialbe statique local et remettez-le sur la ligne pour les autres types d'enregistrements qui ne contiennent pas le numéro acct. * Ecriture de scripts à l'aide de Microsoft Visual C# 2008 * ScriptMain est la classe de points d'entrée du script.*/

en utilisant System; en utilisant System.Data; en utilisant Microsoft.SqlServer.Dts.Pipeline.Wrapper; en utilisant Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] public class ScriptMain: UserComponent { static String AccountNumber = null;

public override void PreExecute() 
{ 
    base.PreExecute(); 
    /* 
     Add your code here for preprocessing or remove if not needed 
    */ 
} 

public override void PostExecute() 
{ 
    base.PostExecute(); 
    /* 
     Add your code here for postprocessing or remove if not needed 
     You can set read/write variables here, for example: 
     Variables.MyIntVar = 100 
    */ 
} 

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    if (Row.RecordType == "02") 
     AccountNumber = Row.AcctNum; // Store incomming Account Number into local script variable 
    else if (Row.RecordType == "06" || Row.RecordType == "07" || Row.RecordType == "08" || 
      Row.RecordType == "09" || Row.RecordType == "10") 
     Row.AcctNum = AccountNumber; // Put Stored Account Number on this row. 
} 

}