SQL Server & ASP .NET Blog

Interessantes und Wissenswertes

Konfiguration von SSIS-Paketen in SQL Server “Denali”

Wie bereits berichtet gibt es für den SQL Server “Denali” eine neue Projektart für SSIS-Projekte. Bisher wurden Pakete immer einzeln bereitgestellt und es gab dabei die Möglichkeit diese im Dateisystem oder in der msdb zu speichern. Konfigurieren konnte man die Pakete über Variablen, die per XML-Datei aus einer Datenbank oder per Umgebungsvariablen gesetzt wurden.

SSIS in SQL Server “Denali” bringt mit dem Project Deployment die SSISDB, Environments und Parameter ins Spiel. Dazu kurze Stichpunkte:

SSISDB – Zentrale Datenbank zum Speichern, Konfigurieren und für das Logging von SSIS Projekten und Paketen
Environment – Container für eine oder mehrere Variablen, die bei der Ausführung von Paketen gesetzt werden können
Parameter – im Grund eine weitere “Variablenart” in SSIS-Paketen, die beim Aufruf eines Paketes oder eines Projektes gesetzt werden kann

Im Grund funktioniert das Zusammenspiel folgendermaßen:

  1. Ein SSIS-Projekt wird angelegt und Parameter werden definiert
  2. Ein Environment mit einigen Variablen wird angelegt
  3. Das SSIS-Projekt wird auf den Server bereitgestellt (direkt aus Visual Studio in die SSISDB)
  4. bei der Ausführung (Execution) wird für das auszuführende Paket die zu verwendete Environment angegeben, die im Paket hinterlegten Parameter werden konfiguriert und das Paket läuft

Die folgende Grafik zeigt dieses Verhalten noch einmal grob:

image

Damit ist es ein Leichtes mehrere Umgebungen mit unterschiedlichen Parameterwerten für bspw. Entwicklungs-, Test- und Produktivumgebungen zu erstellen und während der Ausführung zwischen diesen umzuschalten.

So viel zur Theorie. In der Praxis sieht dieses Vorgehen folgendermaßen aus: Mehr...

SSIS – Startobjekt in einem Projekt

Nur ein kleiner Tipp. Beim Debugging von SSIS-Paketen kann innerhalb eines Projektes ein Paket als Startobjekt gewählt werden (durch Rechtsklick und “Set as StartUp Object”). Will man nun ein einzelnes Paket debuggen startet immer dieses Paket. Soll das wieder geändert werden genügt ein Klick in die Projekteigenschaften im Bereich “Debugging”.

startprojekt

Dort kann das Startup Object wieder abgewählt werden, so dass das jeweils aktive Paket gestartet wird.

SSIS - UNION ALL – Update Metadata

Die Union Transformation in einem SSIS-Datenfluss (SQL Server 2005 und SQL Server 2008) erkennt automatisch, wenn sich die Metadaten des Datenflusses ändern. Nur leider gibt es keinen Weg diese wie bei allen anderen Elementen automatisch mit der Datenquelle zu synchronisieren. Siehe [hier]

Hier stelle ich einen kleinen Workaround vor:

Folgendes Beispiel: Aus zwei Datenquellen sollen Daten zusammengeführt werden. Im Beispiel sind das einfach zwei Select-Statements auf eine Datenbank. Dies funktioniert so lang, wie sich die Tabellenstruktur nicht ändert. Wird beispielsweise eine VARCHAR-Spalte in der Länge geändert gibt das folgendes Bild:

union-all-1

Bei Öffnen der OLE-DB Source wird erkannt, dass sich die Tabelle geändert hat und mit Bestätigung werden die Metadaten auch aktualisiert, doch dann passiert folgendes:

union-all-2

…und bei Ausführung des Paketes gibt es die Fehlermeldung (Anmerkung: Ich habe die Spalte Strasse von VARCHAR(500) auf VARCHAR(600) geändert):

union-all-3

Ein Workaround wäre jetzt das UNION ALL zu löschen und neu zu erstellen, nur “meckern” dann alle nachfolgenden Datenflusselemente. =Schlecht!

Viel besser in den Griff bekommt man das Problem, indem man die Metadaten einfach von Hand ändert. Also Rechtsklick auf das Paket und “View Code” - das zugrundeliegende XML-File öffnet sich. Danach per Textsuche nach dem Union all Element (in meinem Fall heißt das einfach Union All) suchen. Dort im XML File folgen sämtliche Input-Spalten aus allen Elementen davor (im Tag <inputs>). Danach kommt der interessante Teil, die <outputs>.

<outputColumn id="175" name="Strasse" description="" lineageId="175" precision="0" scale="0" length="500" dataType="str" codePage="1252" sortKeyPosition="0" comparisonFlags="0" specialFlags="0" errorOrTruncationOperation="" errorRowDisposition="NotUsed" truncationRowDisposition="NotUsed" externalMetadataColumnId="0" mappedColumnId="0"/>

Hier am Beispiel meine “Strasse” Spalte. Dort steht bei length noch der falsche alte Wert. Diesen kann man einfach durch den richtigen (hier 600) austauschen, speichern, das Paket wieder öffnen und voilá, das Paket funktioniert wieder. Auch alle nachfolgenden Elemente bekommen diese Änderung mit.