Mittwoch, 27. April 2011

SSIS (Integration Services) als ETL Lösung – Package Tools im Eigenbau – Teil 1

In der Vergangenheit habe ich ja schon mehrmals auf die Möglichkeiten der “Developer Side of Microsoft Business Intelligence” hingewiesen. Häufig habe ich dabei auch die Erstellung bzw. Modifikation von SSIS Paketen durch .NET Code gestresst.

Ein Missverständnis dabei ist, dass ich diese Methode ausschließlich für die automatisierte Erstellung von SSIS Paketen (dtsx) empfehle! Der Aufwand, der dafür getrieben werden muss, um eine solche Lösung einzusetzen, ist tatsächlich sehr hoch und ist bei weitem nicht was für jedes Projekt.

Aber, meine Empfehlung ist die “Developer Side” auch für bestehende Lösungen zu nutzen. U. a. für die automatisierte Inventarisierung und Erweiterung von SSIS Paketen, um zum Beispiel Logging und Debug Funktionen. Dieser Ansatz ist gerade für Lösungen interessant, bei denen am Anfang auf die konsequente Verwendung von Templates aus einem Framework verzichtet wurde. Für diesen Verzicht kann es diverse Gründe geben. Häufig ist, dass einfach keine Zeit war und der Kunde möglichst schnell Resultate sehen wollte. Später dann alle Pakete manuell umzustellen wird dann auch wieder oft vermieden, weil der Aufwand auch dann wieder immens sein kann.

Daher habe ich mich entschlossen eine kleine Reihe von Artikeln zu veröffentlichen, um die Möglichkeiten der “Developer Side” für SSIS aufzuzeigen. Die Reihe startet mit diesen wenigen Zeilen Code, welche ein bestehendes SSIS Paket quasi per Knopfdruck um einen SQL Task inkl. Connection erweitern, um ein T-SQL Statement abzufeuern beim Start des Paketes. Das ist noch ein sehr einfaches Beispiel, aber zeigt schon erste wichtige Strukturen. Wir öffnen ein bestehendes Paket, modifizieren es und speichern es wieder.

Dieses Beispiel werde ich dann in den nächsten Wochen weiter verfeinern. Viel Spaß beim Mitmachen!

image

using Microsoft.SqlServer.Dts.Runtime;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using wrap = Microsoft.SqlServer.Dts.Runtime.Wrapper;

Microsoft.SqlServer.Dts.Runtime.Application app;
Package p;

private void bAuswahl_Click(object sender, EventArgs e)
{
    app = new Microsoft.SqlServer.Dts.Runtime.Application();

    DialogResult result = openFileDialog1.ShowDialog();
    if (result == DialogResult.OK)
    {
        p = app.LoadPackage(openFileDialog1.FileName, null);

        ConnectionManager ConnManager = p.Connections.Add("OLEDB");
        ConnManager.Name = "Source"+tbDescription.Text;
        ConnManager.ConnectionString = tbConnString.Text;

        TaskHost th = p.Executables.Add("STOCK:SQLTask") as TaskHost;
        th.Name = tbDescription.Text;
        th.Description = tbDescription.Text;

        th.Properties["SqlStatementSource"].SetValue(th, tbSQL.Text);
        th.Properties["Connection"].SetValue(th, "Source" + tbDescription.Text);

        app.SaveToXml(openFileDialog1.FileName, p, null);
    }