2016-11-21 3 views
2

In einem SSIS-Projekt versuche ich Zeilen aus einer Excel-Dateiquelle herauszufiltern, wobei eine Spalte Werte hat, die in einem Buchstaben beginnen und von Zahlen gefolgt werden. Einige Zellen enthalten mehr als einen Wert und nicht alle Zellen folgen einem Datentypformat. Der Datenfluss ist derzeit wie folgt:
Excel Source > Data Conversion > OLE DB Destination
Ich bin eine bedingte Teilung nach der Excel-Quelle hinzufügen, aber ich habe Probleme mit dem Ausfiltern nicht mehr benötigte Datensätze. Im Folgenden sind Beispiele für Werte, die nicht vor dem Ende des Datenflusses einbezogen werden soll:ssis filtert Zeilen mit Werten aus, die in einem Buchstaben beginnen

Row  Value 
1  1234 
2  P123 
3  P1234, P456 
4  rec P678 

Zeile 1 sollte das einzige sein, die zu dem Ziel fließen sollen. Gibt es eine Möglichkeit, Datensätze auszufiltern, die mit "P" beginnen und von Zahlen gefolgt werden, unabhängig davon, wie viele Werte in jeder Zelle enthalten sind?

Update: Ich arbeite gerade um FINDSTRING (Wert, "P", 1)> 0 || FINDSTRING (Wert, "p", 1)> 0. Die Ausgabe blockiert die Zeilen 2-4, aber der Wert für Zeile 1 wurde auf 0 geändert. Weiß jemand, warum dies passiert?

+1

folgen Sie einfach dem Beispiel und implementieren Sie in Ihrer Anforderung https://www.simple-talk.com/sql/ssis/ssis-basics-using-the-conditional-split/ – mohan111

+0

Hallo! Vielen Dank für die Antwort, aber ich suche nach einem spezifischeren Code für meinen bedingten Split. Grundsätzlich sollte der Split die anderen Zeilen "ausblocken", da sie Datensätze mit P als erstes Zeichen enthalten, gefolgt von Zahlen. Dies bedeutet, dass, wenn ein Wert "Personenwert 1234" ist, dieser Datensatz nicht blockiert werden sollte, da dem "P" keine Ziffern folgen. Mein aktueller Code (der noch nicht funktioniert) ist: FINDSTRING (Wert, "P", 1)> 0 && CODEPOINT (SUBSTRING ([Wert], FINDSTRING (Wert, "P", 1), 3)) > 47 && CODEPOINT (SUBSTRING (Wert, FINDSTRING (Wert, "P", 1), 7)) <58 – Steve

+0

Ich schätze, dass die erste Zeile, die auf Null geändert wird, etwas mit dem * schrecklichen * Ansatz des Excel-Treibers zu tun haben könnte Erraten von Datentypen. Es ist anzunehmen, dass der Datentyp falsch ist, und es gibt nicht viel, was Sie dagegen tun können. Unter diesem Link https://msdn.microsoft.com/en-us/library/ms141683.aspx lesen Sie den Abschnitt mit dem Titel _Missing Values_. Dieses Problem betrifft das gesamte Internet. Ich weiß nicht, warum deine Werte Null statt NULL sind, aber ich bin mir ziemlich sicher, dass es das ist. Nachschlagen * IMEX * für eine Problemumgehung –

Antwort

0

Die zu überprüfende Bedingung prüft, ob ein Feld numerisch ist oder nicht. Leider haben wir keine einfache ISNUMERIC-Funktion innerhalb von SSIS.

Bitte gehen Sie durch den folgenden Link. Dies können wir mithilfe von abgeleiteten Säulen erreichen.

Check IsNumeric() with Derived Column Transform in SSIS Package

0

erste Lösung

Skriptkomponente mit einer .NET-Methode zu überprüfen, ob ein Wert eine Zahl ist.

1) Skriptkomponente Fügen Sie eine Skriptkomponente (Typ: Transformation) hinzu, wo Sie die Überprüfung durchführen müssen.

2) Wählen Sie Eingangsspalten Fügen Sie die Spalte hinzu, die als Eingangsspalte überprüft werden muss.

3) Hinzufügen der Ausgabespalte Fügen Sie den Ausgabespalten auf der Registerkarte Eingänge und Ausgänge eine neue Spalte hinzu. Der Typ Shooting soll Boolean sein und ihm einen passenden Namen geben.

4) Das Script

'Code VB.Net ' Überprüfen Sie, ob der String-Wert eine Zahl Imports System Imports System.Data Importe System.Math Importe Microsoft.SqlServer.Dts.Pipeline enthält. wrapper Importe Microsoft.SqlServer.Dts.Runtime.Wrapper

Public Class ScriptMain 
Inherits UserComponent 

Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) 
    ' Standard VB.net method, indicating whether 
    ' an expression can be evaluated as a number 
    If (IsNumeric(Row.InputCol)) Then 
     Row.IsNumeric = True 
    Else 
     Row.IsNumeric = False 
    End If 
End Sub 

End Class 

5) erstellen Sie ein bedingtes Teilen Zeilen filtern

zweite Lösung

abgeleitete Spalten

1) hinzufügen abgeleitete Spalten eine abgeleitete Spalten hinzufügen, wo Sie die Kontrolle tun müssen.

2) Ausdruck hinzufügen Fügen Sie eine neue Spalte mit dem folgenden Ausdruck hinzu und geben Sie einen geeigneten Namen ein: !ISNULL((DT_I8)TextNumbers). Alle Zahlen führen zu Wahr und alle Nicht-Nummern verursachen einen Fehler.

3) Fehler ignorieren Gehen Sie zum Fenster Configure Error Output in der Spalte Derived und ignorieren Sie Fehler für das neue Feld.

4) Das Ergebnis Fügen Sie eine bedingte Split zum Filtern von Zeilen mit ISNULL Ausdruck

3. Lösung

Datenkonvertierung

1) mit Datenkonvertierung Eine Alternative zu der zweiten Lösung könnte Versuchen Sie, den Wert über eine Datenkonvertierungstransformation in einen int zu konvertieren, und ignorieren Sie alle Fehler. Dann fügen Sie einen bedingten Split zum Filtern von Zeilen mit ISNULL Ausdruck

Verwandte Themen