XML-Daten per FTP verschicken und Pakete konfigurieren

In diesem Artikel soll es zum einen darum gehen, SQL Server Daten als XML-Daten zur Verfügung zu stellen, und zum anderen wie die Paketkonfiguration erleichtert werden kann.

Voraussetzungen

Die Erstellung von Daten im XML-Format wird durch die FOR XML-Klause deutlich erleichtert. Aber damit ist nur der erste Schritt getan. In der Regel möchte man das Ergebnis des SQL in irgendeiner Form verschicken, oft auf einem FTP-Server ablegen. Die SQLServer Integration Services stellen hierfür einige Möglichkeiten bereit, die im Zusammenspiel die Aufbereitung und Versendung der Daten automatisieren.

Grundlegende Paketkonfiguration

Man erstellt ein SSIS-Projekt mit einem Paket, welches im ersten Schritt einige Objekte (Variablen und Verbindungsmanager) erhält.

Variablen

Name Datentyp Zweck
FTP_Pfad String Enthält den Zielpfad auf dem FTP-Server, beginnend mit /
Zwischenergebnis String Nimmt die XML-Daten temporär auf und übergibt sie an den Skripttask

Verbindungsmanager

Name Art Zweck
meinedaten.xml Dateiverbindungsmanager Enthält den Pfad, wo die XML-Datei z. B. auf dem lokalen Server abgelegt wird /
MeinFTPServer FTP-Verbindungsmanager Definiert die Verbindung zum FTP-Server
MeinSQLServer OLE DB systemeigen\SQL Native Client Definiert die Verbindung zum SQLServer von dem die Daten geholt werden sollen

Ablaufsteuerung des Pakets

Hier werden insgesamt drei Schritte benötigt:

  • Task 'SQL ausführen'
  • Skripttask
  • FTP-Task

In der oben angegebenen Reihenfolge werden diese Tasks erstellt und jeweils durch den grünen Pfeil für den Erfolgsfall verbunden.

Task 'SQL-ausführen'

Als erstes müssen die Daten aufbereitet werden. Dieser Task verwendet den Verbindungsmanager MeinSQLServer. Das SQL sollte mit einer Angabe für XML enden, in etwa so:

Select Spalten from MeineTabelle for xml path ('MeineSequence'), root ('MeineDaten')

In der Lasche Allgemein wird noch die Einstellung Resultset = XML getroffen. Damit dieses Ergebnis dann auch weiterverarbeitet werden kann, wird es in der oben definierten Variablen Zwischenergebnis abgelegt. Dies geschieht dadurch, dass man in diesem Task die dritte Auswahl Resultset verwendet. Dort wird der Ergebnisname mit 0 definiert und als Variablenname Benutzer::Zwischenergebnis angegeben.

Skripttask

Der Inhalt der Variablen soll jetzt in eine Datei geschrieben werden. Hierzu verwendet man z. B. einen Skripttask mit Microsoft Visual Basic .NET. Die zweite Auswahl zum Skripttask (Skript) ist der zentrale Einstieg. Zur Übergabe der Variablen Benutzer::Zwischenergebnis an das Skript, wird diese hier als ReadOnlyVariables angegeben.

Der Button "Skript entwerfen" öffnet den entsprechenden Editor. Hier kann die folgende Minimalversion zum Einsatz kommen, wobei der Zielpfad für die XML-Datei einfach aus dem Dateiverbindungsmanager kopiert wird. Denn von hier will ja später der FTP-Task die Datei abholen. Weiterhin umgibt die Variable leider noch eine Klammerung mit ROOT, die wir entfernen müssen, da wir ja bereits unsere eigene Root (MeineDaten) im SQL definiert haben.

Public Sub Main()
Dim XMLString As String = Nothing
Dim XMLPfad As String = Nothing

XMLPfad = Dts.Connections.Item("meinedaten.xml").ConnectionString
Dim sw As New IO.StreamWriter(XMLPfad)

XMLString = Dts.Variables("Zwischenergebnis").Value.ToString.Replace("<ROOT>", "").Replace("</ROOT>", "")
sw.Write(XMLString)
sw.Dispose()

Dts.TaskResult = Dts.Results.Success


End Sub

FTP-Task

Als letztes werden die Daten auf den FTP-Server übertragen. SSIS stellt hierfür einen FTP-Task zur Verfügung, der zum einen die Verbindungsmanager MeinFTPServer und meinedaten.xml verwendet, zum anderen die zweite Variable FTP_Pfad.

In der Auswahl Allgemein wird für die FtpConnection der FTP-Verbindungsmanager ausgewählt.

In der Auswahl Dateiübertragung werden die Parameter folgendermaßen definiert:

RemoteParameter IsRemotePathVariable True
RemoteVariable Benutzer::FTP_Pfad
OverwriteFileAtDest wird man in der Regel auf True stellen
Lokale Parameter IsLocalPathVariable False
LocalPath meindedaten.xml
Vorgang Operation Datei senden
IsTransferAscii False

Paket konfigurieren

Damit das Paket einfacher auf die Belange von Entwicklung und Produktion ausgerichtet werden kann, werden alle wichtigen Teile durch eine Paketkonfiguration nach außen verlagert. In der entstandenen XML-Datei kann dann die Konfiguration entsprechend angepasst werden. Bei der Erstellung des Auftrags kann dann die eine oder andere Paketkonfiguration ausgewählt werden. Den Namen des SQLServers kapsele ich hingegen immer über Alias-Namen, da ich diese z. B. auch für die Entwicklung der Reports verwende. Details hierzu finden sich u. a. in diesem Artikel: SSIS Pakete verteilen

In der erstellten Konfigurationsdatei soll folgendes angegeben werden

  • der Name des FTP-Servers
  • der Pfad im FTP-Server
  • User und Kennwort vom FTP-Server
  • der Pfad der XML-Datei auf dem SQL-Server, dieser wird auch im Skripttask verwendet

Wer sich noch nie an diesem Thema versucht hat, wird erstaunt sein, wie einfach es ist. Die Erstellung der ersten Konfigurationsdatei erfolgt über das VisualStudio. Im Menüpunkt SSIS findet sich der Punkt Paketkonfigurationen. Der Paketkonfigurationsplaner unterstützt den Anwender dann bei den notwendigen Schritten. Als erstes wählen wir hier den Button Hinzufügen und danach XML-Konfigurationsdatei. Der Konfigurationsdateiname wird hier angegeben, die Datei wird im nächsten Schritt erstellt. Sinnvollerweise verwendet man hier einen UNC-Pfad (z. B. auf dem Server), der auch im Auftrag verfügbar ist. In der folgenden Maske können wir aus der Auswahl der Objekte die passenden selektieren und auf der rechten Seite werden uns die aktuellen Eigenschaftsattribute angezeigt. Wir wählen also folgende:

  • Variablen, FTP_Pfad, Properties, Value
  • Verbindungs-Manager, meinedaten.xml, Properties, ConnectionString
  • Verbindungs-Manager, FTP_Server, Properties, Servername
  • Verbindungs-Manager, FTP_Server, Properties, ServerPassword
  • Verbindungs-Manager, FTP_Server, Properties, ServerUserName

Nachdem wir der Konfiguration einen Namen gegeben haben, wird die Datei erstellt und wir können sie z. B. für Produktion kopieren und anpassen. Im Auftrag wird dann jeweils die gewünschte Konfigurationsdatei ausgewählt und so kann dasselbe Paket für Entwicklung und Produktion verwendet werden.

Fazit

Der Artikel gibt einen kurzen Überblick über die Möglichkeiten durch Kombination von Skripttask und FTP-Task Daten bereitzustellen. Weiterhin werden die Ansätze der Paketkonfiguration gezeigt. Solche Pakete ermöglichen mit wenig Programmieraufwand die einfache Verteilung von Daten.