In einer SSIS-Datenflussaufgabe haben wir eine abgeleitete Spaltentransformation mit ungefähr 100 Spalten (im Grunde genommen werden rohe Eingabezeichenfolgen in typisierte Variablen konvertiert). Wenn diese Aufgabe fehlschlägt, gibt es eine Möglichkeit , zu Protokollierungszwecken festzustellen , welche Spalte den Fehler verursacht hat? Die einzigen anderen Alternativen, die ich mir vorstellen kann, sind eine benutzerdefinierte Skriptaufgabe, um jede Konvertierung einzeln durchzuführen (yuck) oder eine separate abgeleitete Spaltentransformation für jeden Datenpunkt (double yuck).
Grundsätzlich möchte ich nur in der Lage sein, Fehlerzeilen umzuleiten und zu wissen, warum sie fehlgeschlagen sind.
Also ein Beispiel. Unser Paket wird verwendet, um Benutzern das Hochladen in unsere Datenbank mithilfe von Excel-Tabellen zu ermöglichen. Nehmen wir also an, die eingehende Tabelle sieht folgendermaßen aus (außer es gibt Hunderte von Spalten):
+--------+-----------------+---------+------------+---------+
| Text1 | Number1 | Number2 | DateTime1 | Text2 |
+--------+-----------------+---------+------------+---------+
| Spring | 1 | 1 | 1/1/0001 | Flowers |
| Summer | 2 | 2 | 6/1/2015 | Sweaty |
| Fall | N/A | 3 | 10/31/2099 | Crunchy |
| Winter | This is garbage | 4 | 12/12/2020 | Icy |
+--------+-----------------+---------+------------+---------+
In diesem Fall möchten wir, dass Frühling, Sommer und Herbst erfolgreich sind. Fallen mit haben einen Nullwert für Number1
. Die abgeleitete Spalte enthält eine Logik, die ungefähr so aussieht (keine gültige Syntax, nur die Logik).
sanitizedNumber1 = Number1 == "N/A" ? null : cast(Number1 as int)
Winter
wird über den Fehlerpfad umgeleitet und protokolliert. Gibt es eine Möglichkeit zu wissen, welche abgeleitete Spalte fehlgeschlagen ist? Wieder haben wir ungefähr 100 Eingaben, die in dieser Transformation auf ähnliche Weise verarbeitet werden. Ich möchte in der Lage sein, etwas zu protokollieren wie:
Importdatensatz "Winter" wegen ungültiger Daten in "Nummer1" fehlgeschlagen
Es muss nicht unbedingt dieses Format sein, aber alles, was es einem Benutzer ermöglichen würde, den fehlerhaften Datenpunkt eindeutig zu identifizieren, wäre akzeptabel. Ich weiß, dass dies mit einer Skriptkomponente und manueller Durchführung der Konvertierungen möglich wäre (was wir tun müssen, wenn es keine bessere Option gibt), aber wenn es möglich ist, nur die Transformation für abgeleitete Spalten zu ändern, um etwas in diese Richtung bereitzustellen Ich würde das lieber tun, anstatt die gesamte Komponente in einem Skript neu zu implementieren.
quelle
Antworten:
Sie müssen die Fehler manuell identifizieren.
Leiten Sie die Zeilen (wie Sie derzeit sind) in eine Tabelle um, die Ihren Spalten entspricht, und fügen Sie einfach eine IDENTITY-Spalte hinzu. Diese Tabelle sollte alle
VARCHAR
Datentypen enthalten, damit Sie alle ursprünglichen Werte beibehalten .Jetzt können Sie Ihre Fehler mithilfe von TRY_CAST identifizieren, wenn Sie die Tabelle abfragen.
Zum Beispiel:
TRY_CAST konnte den Wert in der
Winter
Spalte nicht in einen Wert umwandeln, derint
Sie mit a belässtnull
. Sie können dies für alle Spalten tun.Wenn es Ihre Zeit wert ist, können Sie eine komplexere Abfrage durchführen, um jeden Spaltennamen zurückzugeben, der NULL enthält. Wenn nicht, sollten Sie relativ einfach visuell prüfen können.
Wenn die meisten Ihrer Fehler "NaN" oder "N / A" sind, besteht eine gute Chance, dass Sie Zeit damit verschwenden, Fehler zu identifizieren, von denen Sie bereits wussten. Bereinigen Sie die Probleme, bevor sie eins werden:
Als Randnotiz können Sie
TRY_CAST
mit vertikaler Bearbeitung ganz einfach bis zu 100 Spalten hinzufügen : Halten Sie Alt+ Shiftin SSDT oder SSMS (auch einige andere Apps) gedrückt und bearbeiten Sie dann ↑oder ↓dann Hunderte von Zeilen gleichzeitig.quelle
Bearbeiten Sie die Transformation für abgeleitete Spalten und klicken Sie auf die
[Configure Error Output...]
Schaltfläche unten im Dialogfeld des Transformationseditors.Wählen Sie unter der
[Error]
Spalte die Option Zeile umleiten aus der Dropdown-Liste aus.Jetzt werden Ihre fehlgeschlagenen Zeilen durch die Fehlerausgabe der Transformation (die rote Linie) geleitet. Je nachdem, wie Sie die Fehler protokollieren möchten, fügen Sie ein OLE DB-Ziel oder ein Recordset-Ziel hinzu oder an was auch immer Sie die fehlgeschlagenen Zeilen senden möchten.
quelle
Row whatever has something bad in it. Check all 3784 columns and find it
.