Question

Je suis en train de créer un processus ETL dans MS SQL Server et je voudrais avoir des erreurs spécifiques à une colonne particulière d'une ligne particulière. Par exemple, les données sont d'abord chargé à partir de fichiers Excel dans une table (nous appellerons la table initiale) où toutes les colonnes sont varchar(2000) et je mets en scène les données à une autre table (DataTypedTable) qui contient des types de données plus spécifiques (datetime, int, etc.) ou plus étroitement contraint les longueurs de varchar. Je dois être en mesure de créer des messages d'erreur pour un champ spécifique tel que: « 13 janvier » est pas un format de date valide pour la date de soumission. S'il vous plaît utiliser un format de MM / JJ / AAAA

Ces messages d'erreur devraient être stockées d'une manière telle que plus tard dans le processus d'un processus automatisé peut créer des rapports avec les messages d'erreur tels que chaque message fait référence à une ligne et champ spécifique (quelqu'un devra revenir en arrière et corriger la données dans le système source et soumettre à nouveau le fichier Excel). Donc, idéalement, il serait inséré dans un tables échecs de quelque sorte et contiennent la clé primaire de la ligne a échoué, le nom de colonne, et le message d'erreur.

Question: Je me demande si cela peut être accompli avec SSIS, ou un outil open source comme Talend, et si oui, quelle serait votre approche générale? Ou quelle approche code main que vous prendriez?

Couple approches que j'ai pensé à utiliser SQL (jusqu'à pas que je l'ai fait à la main dans ETL procs SQL, mais je veux d'envisager d'autres approches possibles C #, même..):

Utilisez un curseur pour lire le tableau initial, et pour chaque ligne insérer un enregistrement vide avec seulement la clé primaire dans la table DataTyped, utilisez une déclaration de mise à jour unique pour chaque colonne, de sorte que si cette mise à jour échoue, je peux insérer un message d'erreur très spécifique spécifique à cette colonne dans la table des messages d'erreur.

Insérez toutes les données est dans la table DataTyped, mais avoir des colonnes en double comme SubmissionDate et SubmissionDateOld. Après l'insertion initiale des colonnes * anciennes contiennent des données, le reste sont vides, et j'ai une mise à jour unique pour chaque colonne qui définit le SubmissionDate sur la base SubmissionDateOld.

En plus de suggérer une approche, je voudrais savoir si vous utilisez cette approche ou quelque chose de similaire déjà dans le travail que vous faites.

Était-ce utile?

La solution

J'utilise le aproche où je mets une scission conditionnelle dans le flux de données. Les dossiers qui échouent les conditions (date non valide, pas de données dans un champ obligatoire, etc.) sont ensuite envoyés à une table d'exception qui comprend l'identificateur d'enregistrement, les mauvaises données, la raison pour laquelle il a échoué. Vous pouvez ensuite plus tard créer un fichier tableur ou d'un texte d'erreurs de ces informations à envoyer au groupe fournissant le fichier. De bons dossiers bien sûr aller au chemin de pther et sont insérés dans la table.

Autres conseils

Que diriez-vous d'un nettoyage / transformation avant le chargement dans la mise en scène (ce que vous appelez des tables initiales) tables? Vider les données d'Excel dans un fichier séparé par des virgules ou onglet, puis utiliser des langages de programmation de votre choix pour faire le nettoyage des données que vous avez noté. De plus, quelle est la taille de chaque charge de données? Vous pouvez utiliser l'application multi-thread ou multi-processus pour gérer des charges importantes (comme le chargement de quelques millions de lignes à la fois). Au cours de ce processus toute erreur que vous rencontrez peut être chargé dans la table d'exception avec des détails identifiant, erreur et commentaires. Cette technique permet d'avoir un meilleur contrôle lors de la phase de nettoyage des données.

Si la charge est pas élevé et que vous voulez faire la plupart de votre travail dans la base de données (SQL), vous pouvez faire autant de profils de données que possible et avoir une bonne understading des variations de données possibles que vous pouvez vous attendre. Avec cela, vous pouvez utiliser le composant approprié (ou SSIS Talend) pour effectuer la transformation ou de contrôler le flux de données. De plus, en utilisant des expressions régulières, vous pouvez prendre toute entité qui dévie de la règle de jeu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top