2010-08-20 4 views
4

Donc, je viens de commencer diggin SSIS aujourd'hui, alors ne déteste pas trop s'il y a quelque chose d'évident que je suis manquant.SSIS: du fichier XML à plusieurs tables

J'ai un fichier XML (d'un tiers)

<root> 
    <foo> 
     <fooId>12345</fooId> 
     <name>FOO</name> 
     <bars> 
      <bar>BAR 1</bar> 
      <bar>BAR 2</bar> 
      [...] 
     </bars> 
    </foo> 
    [...] 
</root> 

et tables correspondantes dans mon DB:
Foo avec des champs (fooid, Nom)
Bar avec des champs (BarID (identité PK), FooID, Name)

Donc, fondamentalement, Bar est comme un ensemble d'attributs pour Foo. Donc, j'ajoute une source XML qui pointe vers ce fichier et produit 3 ensembles de données différents (foo, bars, bar). Le problème est que bar contient la valeur de bar + quelques ID générés automatiquement, ce qui n'est pas très utile. Le seul moyen d'obtenir un bar avec bar valeur et fooId est de trier et de fusionner ces ensembles, ce qui semble plutôt étrange et va probablement tuer brutalement les performances (on parle ici de centaines de K de foo).

La question est: comment le faire correctement?

Répondre

1

Je ne m'inquiéterais pas encore d'optimiser les performances. Ajoutez simplement une autre étape SSIS pour transformer les ensembles de données.

Lorsque vous avez tout le fonctionnement de la performance d'examen. Les transformations SSIS sont plus faciles à maintenir que XSLT. Des centaines de K de foo ne devraient pas poser de problème, selon la fréquence d'exécution du module.Je n'ai pas utilisé SSIS pour ETL depuis un moment, donc je ne suis pas tout à fait en avance sur cela, mais j'utilise XSLT, et une étape supplémentaire de SSIS est plus facile à maintenir si vous restez simple.

Juste mon avis.

1

Je n'ai pas encore eu l'occasion d'utiliser des sources de données XML dans SSIS. BizTalk est notre outil de choix ici. Quoiqu'il en soit, je l'ai fait un peu de recherche et a trouvé un article très utile ici:

http://blogs.msdn.com/b/mattm/archive/2007/12/11/using-xml-source.aspx

Suivez la section sur le traitement de plusieurs sorties, sauf procédez comme suit:

  1. Remplacer toutes les références à leur élément avec votre élément
  2. Remplacer toutes les références à leur élément avec votre élément

, calculé à partir thi s, configurez votre source de données XML par article. Modifiez-le avec l'éditeur de propriétés avancé en utilisant les potins mentionnés ci-dessus. Prenez les deux sorties pour les barres et les barres et acheminez-les dans la jointure de fusion. Inner les rejoint sur bars_Id. Sélectionnez bar et foo_Id comme colonnes de sortie. Cela sera capable de nourrir votre table Bars.

Je sais que ce n'est pas idéal car vous êtes en train de trier et fusionner. Heureusement, en effectuant le tri dans la source de données XML, l'impact sur les performances ne sera pas très important.

Une autre solution à prendre en compte consiste à utiliser un fichier XSLT pour aplatir le fichier XML. Ceci est fait avec une tâche XML dans le flux de contrôle. Voici un article qui pourrait être utile aussi bien:

http://blogs.msdn.com/b/mattm/archive/2007/12/15/xml-source-making-things-easier-with-xslt.aspx

Bonne chance!

+0

C'est à peu près ce que je fais en ce moment ... Ce que je m'attendais à trouver est la possibilité d'ajouter une colonne à l'ensemble du sous-élément à partir de son élément parent, car il est déjà donné par la structure. semble être pas une façon facile de le faire (ou peut-être que je suis aveugle?) –

+1

Donc, je vais essayer d'aller avec l'approche XSLT. Cela aplanirait le schéma XML à un point où vous ne pourriez avoir qu'une seule sortie de la source de données XML. Ironie du sort que nous utilisons XSLT pour faire fonctionner XML comme un fichier plat. –

1

@ votre commentaire à Chris: Il y a un moyen facile d'ajouter une colonne sur un objet. Ajoutez une étape à l'intérieur de votre tâche de flux de données, utilisez l'étape de transformation "Colonne dérivée". À l'intérieur de là, ajoutez/manipulez les colonnes dont vous avez besoin.

XSLT est une douleur.

Questions connexes