CiAgICA8IS0tIExpbmtlZEluIC0tPgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICAgIF9saW5rZWRpbl9wYXJ0bmVyX2lkID0gIjEyMzUwNzMiOwogICAgICAgIHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyA9IHdpbmRvdy5fbGlua2VkaW5fZGF0YV9wYXJ0bmVyX2lkcyB8fCBbXTsKICAgICAgICB3aW5kb3cuX2xpbmtlZGluX2RhdGFfcGFydG5lcl9pZHMucHVzaChfbGlua2VkaW5fcGFydG5lcl9pZCk7CiAgICA8L3NjcmlwdD48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgICAgKGZ1bmN0aW9uKCl7dmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF07CiAgICAgICAgICAgIHZhciBiID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgICAgICAgIGIudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiO2IuYXN5bmMgPSB0cnVlOwogICAgICAgICAgICBiLnNyYyA9ICJodHRwczovL3NuYXAubGljZG4uY29tL2xpLmxtcy1hbmFseXRpY3MvaW5zaWdodC5taW4uanMiOwogICAgICAgICAgICBzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGIsIHMpO30pKCk7CiAgICA8L3NjcmlwdD4KICAgIDxub3NjcmlwdD4KICAgICAgICA8aW1nIGhlaWdodD0iMSIgd2lkdGg9IjEiIHN0eWxlPSJkaXNwbGF5Om5vbmU7IiBhbHQ9IiIgc3JjPSJodHRwczovL3B4LmFkcy5saW5rZWRpbi5jb20vY29sbGVjdC8/cGlkPTEyMzUwNzMmZm10PWdpZiIgLz4KICAgIDwvbm9zY3JpcHQ+CiAgICA8IS0tIEVuZCBMaW5rZWRJbiAtLT4KICAgIA==
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Break(point)dance

Häufig bestehen SSIS-Pakete aus einem Schleifencontainer mit dem mehrere strukturgleiche Quelldateien in eine SQL-Server-Datenbank importiert werden. Da der Datentyp für die jeweilige Spalte in der Ziel-SQL-Server-Tabelle festgelegt wird, muss jeder Datensatz der Importdateien dieser Definition entsprechen, ansonsten kommt es zu Fehlern beim Importvorgang. Häufig kommt es jedoch vor, dass Datensätze aus den Quelldateien nicht dem Datentyp der Zieltabelle entsprechen. Für diese Datensätze muss der Datentyp entsprechend korrigiert werden. Allerdings liefert uns die Statusmeldung des SSIS-Pakets hier keine ausreichend ausführliche Information, welche der Quelldateien betroffen ist. In unserem neuesten Standard-SSIS-Paket, das als Grundlage in unseren Projekten dient, kann die betreffende Tabelle durch ein ausgeklügeltes Logging-Verhalten leicht identifiziert werden. In der Praxis begegnen uns jedoch oft SSIS-Pakete, die über dieses Logging-Verhalten noch nicht verfügen. Doch anstatt sich auf eine mühsame Fehlersuche innerhalb der Quelldateien einzulassen, bietet dieser Blogbeitrag einen pragmatischen und deutlich einfacheren Ansatz. Nämlich die Identifikation der Datentyp-Übeltäter mit Hilfe von Breakpoints. 

In diesem Beispiel sollen zwei strukturgleiche Excel-Tabellen in eine SQL-Server-Tabelle importiert werden.  

Quelldateien

Abbildung 1: Quelldateien

Hierfür wurde ein SSIS-Paket mit einem Datenfluss-Task erstellt. Dieser befindet sich einem Schleifencontainer und lädt mit Hilfe einer Variablen die Excel-Importdateien in die Ziel-SQL-Server-Tabelle. Die Variable wird im Fenster Variablen festgelegt und enthält den Dateinamen (Bezeichnung hier: „Excel“).

Abbildung 2: SSIS-Ablaufsteuerung

Um einen Fehler zu provozieren, enthält ein Datensatz innerhalb einer der Importdateien einen falschen Datentyp. Diese Zeichenfolge entspricht nicht dem float-Datentyp der Zieltabelle.

Datensatz_mit_falschem_DatentypAbbildung 3: Datensatz mit falschem Datentyp

Startet man nun das SSIS-Paket kommt es, wie erwartet, zum Fehler.

Fehler_beim_ImportprozessAbbildung 4: Fehler beim Importprozess

Allerdings ist die Fehlermeldung im Status-Fenster nicht informativ genug. Es wird nicht klar, welche der Excel-Dateien betroffen ist.

Fehlermeldung_im_SSIS-Status-FensterAbbildung 5: Fehlermeldungen im SSIS-Status-Fenster

Um sich jetzt die betroffene Excel-Datei im SSIS-Paket anzeigen lassen zu können, sind ein paar Einstellungen notwendig. Zunächst muss man zum Datenfluss-Task einen Breakpoint hinzufügen. Dies geschieht mittels Rechtsklick auf den Task – „Breakpoints bearbeiten“:

Breakpoint-hinzufuegenAbbildung 6: Breakpoint hinzufügen

Es muss der Breakpoint „Unterbrechen, wenn der Container das OnError-Ereignis empfängt.“ aktiviert werden: Es muss der Breakpoint „Unterbrechen, wenn der Container das OnError-Ereignis empfängt.“ aktiviert werden:

Breakpoint_festlegenAbbildung 7: Breakpoint festlegen

Im Feld des Datenfluss-Tasks erscheint nun ein roter Punkt. Das bedeutet, dass der Breakpoint aktiv ist.

Symbol_fuer_vorhandenen_BreakpointAbbildung 8: Symbol für vorhandenen Breakpoint

Startet man nun das SSIS-Paket erneut, wird dieses bei einem Fehler unterbrochen und in dem roten Punkt erscheint ein Pfeil.

Achtung: Da der Debug-Modus nur für das komplette Paket funktioniert, reicht es nicht den Container einzeln auszuführen.

Im nächsten Schritt muss per Rechtsklick auf den Task eine „Überwachung“ hinzugefügt werden:

Ueberwachung_hinzufuegenAbbildung 9: Überwachung hinzufügen

Standardmäßig ist das Überwachungsfenster deaktiviert. Dieses kann über das Menü aktiviert werden (Debuggen, Fenster, Überwachen, Überwachen 1):

Fenster_Ueberwachung_aktivierenAbbildung 10: Fenster Überwachung aktivieren

Leeres_UeberwachungsfensterAbbildung 11: Leeres Überwachungsfenster

Das Fenster „Überwachen 1“ ist zunächst leer.

Es gilt die Variable „Excel“ zu überwachen, da diese vom Schleifencontainer genutzt wird und daher zu einem Zeitpunkt des Importprozesses den Dateinamen der Tabelle mit dem falschen Datentyp enthält.

VariablenAbbildung 12: Variablen

Diese Variable muss nun per Drag-and-drop aus dem Fenster „Variablen” in das Fenster „Überwachen 1“ gezogen werden.

Ueberwachung_von_Excel-VariableAbbildung 13: Überwachung von Excel-Variable

Nun wird uns in der Spalte „Wert“ der Dateiname der betreffenden Excel-Datei angezeigt.

Zu dem Zeitpunkt, an dem unser Breakpoint das Paket stoppt, enthält die Variable des Schleifencontainers genau den Dateinamen, in dem sich der Datensatz mit dem falschen Datentyp verbirgt. Nun haben wir den Übeltäter identifiziert und der Datentyp kann korrigiert werden.