Home
Datenquellen
Controllflow
DataFlow
SSIS
ToC
Impressum
Das Datenziel ist eine XML Datei

Beim SSIS gibt es standardmäßig zwar eine Möglichkeit XML Dateien einzulesen, ein Datenziel XML Datei ist aber nicht vorhanden.

Mit Hilfe der Script Komponente für Datenziele (Destination) kann dieses neue Datenziel einfach selbst erstellt werden.

Das DotNet Framework bietet natürlich geeignete Klassen, die wir für diese Funktionen verwenden können. Damit wir unser eigenes Datenziel erstellen können sind einige Vorarbeiten notwendig.

Optional aber dringend empfohlen: Zuerst erstellen wir einen Connection Manager auf eine Textdatei. Damit dieser Connection Manager angelegt werden kann, muss eine Ausgabespalte definiert werden. Später in der Script Komponente wird nur der Pfad für die Ausgabedatei aus diesem Connection Manager verwendet. Damit können die normalen Möglichkeiten, zum Beispiel das konfigurieren der Pfadangaben, von SSIS genutzt werden.

Flat File Connection Manager Editor

 

Select Script Componente TypeWenn die Script Komponente (im Dataflow) auf die Entwurffläche gezogen wird, erscheint ein Dialog bei dem ausgewählt wird, welche Funktion per Scriptkode ausgeführt werden soll. Für dieses Beispiel wird Datenziel (Destination) ausgewählt.

 

 

 

Danach muss die Script Komponente noch einmal verlassen werden und die Verbindung zu den Daten, die als XML Datei ausgegeben werden sollen, hergestellt werden.

Script Transformation Editor

Danach wird in der Script Komponente der eigentliche Kode in VB.Net geschrieben. Die Ausgabe der XML Datei erfolgt mit Hilfe der Methoden aus der Klasse XmlTextWriter. Dazu können wir mit Hilfe der Anweisung Imports System.Xml diese Klasse zugänglich machen.
In der Regel werden wir aber bei der Anweisung Dim xWriter as XMLTextWriter einen Fehler bekommen.

Script

Um diesen Fehler zu beheben, muss im Kodefenster unter Project der Punkt Add Referenz ausgewählt werden. Die Klasse XmlTextWriter ist in der Datei System.Xml.dll gespeichert.

Add Reference

Diese DLL muss als Referenz zwingend zum Projekt hinzugeführt werden.

Danach kann der Kode geschrieben werden. Der Kode sieht komplizierter aus, als er ist. Um den Kode zu schreiben habe ich diesen grundsätzlichen Rahmen verwendet.

Bei der Entwicklung des Beispielpakets bin ich auf einige Probleme gestoßen:

  • Die SQL Abfrage liefert in mindestens einer Zeile (353) in der Spalte PurchaseOrderNumber eine NULL als Wert. Da die Script Komponente kein Debuggen mit Visual Studio zulässt, waren Hilfsmittel aus der guten alten Zeit notwendig. In der Script Task im Controlflow kann aber sehr wohl mit Hilfe von Visual Studio normal debugged werden.
    Eines dieser Hilfsmittel, ist das Erzeugen von Tracemeldungen mit Hilfe der Anweisung: Me.ComponentMetaData.FireInformation(1, "Input0_ProcessInputRow", "Input0_ProcessInputRow", "", 0, True)
    Mit dieser Anweisung können Informationen in das Process Protokoll geschrieben werden.
     
  • Die Verwendung des Try .. Catch Blockes ist zwar schön, brachte aber keine wirklich zielführende Fehlermeldung. In einer normalen produktiven Umgebung ist der Befehl MsgBox, den ich im Try ... Catch Block verwendet habe natürlich nicht wirklich sinnvoll.
     
  • Ein wahrer Performance Killer ist folgende Anweisung die zum Formatieren der XML Daten dient:

       .Formatting = Formatting.Indented
       .Indentation = 3

    in der Prozedur PreExecute. Damit steigt die Verarbeitungszeit in meiner Umgebung von ungefähr 30 auf 550 Sekunden. Selbstverständlich wird auch das erzeugte XML Dokument wesentlich größer. Im Beispielpaket ist diese Anweisung auskommentiert.
     
  • Das Datumsfeld wird mit der Anweisung Row.OrderDate.ToString("s") regelkonform in das Format YYYY-MM-DDTHH:MM:SS formatiert.
     
  • Die Formatierung des Wertes aus der Spalte UnitPrice hat für mich mehr Aufwand gebracht als erwartet. Die Regel sagt, dass der Wert ohne Tausendertrennzeichen und mit einem Punkt als Dezimaltrennzeichen ausgegeben werden muss. Ich konnte das mit Hilfe der Anweisung
    InvC = New CultureInfo("en-US", False)
    ....
    Row.UnitPrice.ToString("#.##", InvC)

    erreichen. Eigentlich hätte ich erwartet, dass es einfach geht.

Ab der CTP 16, September 2005, wird immer standardmäßig der Kode in der Script Komponente oder der Script Task kompiliert. Wenn Sie später das SSIS Paket öffnen, bekommen Sie diese Meldung angezeigt.

Infobox

Bitte bestätigen Sie einfach mit Ja, sonst können Sie dieses Paket nicht laden. Die Meldung wird durch den kompilierten Kode in einer oder mehreren Script Tasks oder Transformationen ausgelöst.

Wenn Sie das Beispielpaket ausführen, erhalten Sie eine XML Datei mit einer Größe von ungefähr 2 GB. Verwenden Sie die Formatierung, so wird die Ausgabedatei wesentlich größer

Hier finden Sie das Beispielpaket. Als Datenquelle wird die Demodatenbank AdventureWorks verwendet.

Bitte achten Sie darauf, dass die Connection Manager an Ihre Umgebung angepasst werden müssen.

Komponentenindex:

  • Datenflusstask
  • Flatfilequelle
  • Script Transformation