Gibt es eine Möglichkeit festzustellen, welche abgeleitete Spalte fehlgeschlagen ist?


7

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)

Winterwird ü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.


Woher kommen diese Daten? Können Sie Ihre Typumwandlungen nicht in der Quelle ausführen?
Dave

Es ist etwas komplizierter. Die Quelle ist eine Excel-Tabelle, in der Werte numerische oder String-Sentinel-Werte sein können (denken Sie an N / A oder NaN). Wenn eine Zeile Mülldaten enthält, möchten wir diese Zeile verwerfen und den Fehler protokollieren, anstatt die Komponente zu versagen. Wir möchten jedoch wissen, welcher Datenpunkt Müll war und nicht nur "es gab Müll".
MikeTheLiar

Dafür ist die ErrorColumn-Eigenschaft gedacht. Obwohl das Zuordnen zu einem Spaltennamen schwieriger zu sein scheint, als es sein sollte ...
Martin Smith

1
SQL Server 2016 bietet den Namen der Fehlerspalte mssqltips.com/sqlservertip/4066/… Nur 11 Jahre nach Veröffentlichung des Produkts
billinkc

@ Bill hahaha, und wir haben gerade ein Upgrade von 2008 auf 2012 durchgeführt, also freue ich mich darauf, das in 6 oder 7 Jahren schluchzend zu nutzen
MikeTheLiar

Antworten:


1

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 VARCHARDatentypen 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:

SELECT
Identity,
TRY_CAST(Winter As INT) As WinterConverted,
Winter
--------------------------------------
Identity  |  WinterConverted   | Winter
   1      |    NULL            | NaN

TRY_CAST konnte den Wert in der WinterSpalte nicht in einen Wert umwandeln, der intSie mit a belässt null. 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:

Winter == "NaN" || Winter == "N/A" ? -1 : (DT_I4)Winter

Als Randnotiz können Sie TRY_CASTmit 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.


Ich glaube, ich verstehe diese Antwort entweder nicht oder ich habe meine Frage nicht sehr gut erklärt. Ich werde meine Frage mit etwas mehr Informationen bearbeiten.
MikeTheLiar

Ich habe die Frage bearbeitet und ein Beispiel hinzugefügt.
MikeTheLiar

0

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.


Ja, das weiß ich (das machen wir jetzt) ​​- aber das sagt nicht, welche Spalte fehlgeschlagen ist . Ich weiß nur, welche Zeile fehlgeschlagen ist. Angesichts der Tatsache, dass es sich möglicherweise um Hunderte von Spalten handelt, möchte ich feststellen können, welche Daten schlecht waren, anstatt nur zu sagen Row whatever has something bad in it. Check all 3784 columns and find it.
MikeTheLiar

OK. Nun, Ihr Beitrag war darüber nicht ganz klar. Wenn Ihre abgeleitete Spaltenkomponente nur 1 Spalte behandelt, wissen Sie, welche Spalte fehlgeschlagen ist. Wenn Ihre Komponente 200 abgeleitete Spalten definiert und eine fehlschlägt, besteht Ihre einzige andere Option AFAIK darin, die 200 abgeleiteten Spalten irgendwo im Fehlerpfad zu untersuchen, um Metadaten hinzuzufügen, bevor Sie die fehlgeschlagenen Zeilen irgendwo beibehalten.
Mathieu Guindon
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.