2016-05-10 7 views
1

Ich las auf Left, Right, Substring, CharIndex, war aber nicht in der Lage, die Lösung korrekt zu implementieren. Ich möchte umrechnen:Erhalte die Zeichenfolge zwischen Zeichen mit SSIS

1; #Jackson, Michael (X) To: Jackson, Michael

Grundsätzlich möchte ich 1 entfernen; # von links und Räume und (X) nach dem Namen endet. Ich kann keine fest codierten Nummern verwenden, da die Länge des Vor- und Nachnamens variieren kann. Kannst du bitte helfen? Ich möchte dies mithilfe der Komponente Abgeleitete Spalte in SSIS tun.

+0

Ist das führende Muster immer digit-semicolon-sharp oder variiert es? Ist das nachfolgende Muster immer openparen-X-closeparen? – billinkc

+0

Wahrscheinliche Duplikate [ex1] (http://stackoverflow.com/a/33023858/181965) [ex2] (http://stackoverflow.com/q/31122657/181965) [ex3] (http://stackoverflow.com/a/15176398/181965) – billinkc

+0

@billinkc: Ja, das führende Muster ist immer Ziffer (s) -semicolon-sharp. Das nachfolgende Muster ist immer openparen-X-closeparen. – Rocky

Antwort

0

Hier sind ein paar mögliche Lösungen, je nach Ihren Bedürfnissen.

T-SQL

DECLARE @text varchar(100) = '1;#Jackson, Michael (X)', @clean_text varchar(100) 
SELECT @clean_text = RTRIM(SUBSTRING(@text, CHARINDEX('#', @text) + LEN('#'), 
       CHARINDEX('(X)', @text, CHARINDEX('#', @text)) - (CHARINDEX('#', @text) + LEN('#')))) 
SELECT @clean_text 

C#

string text = "1;#Jackson, Michael (X)", clean_text = "", hash = "#", x = "("; 
clean_text = text.Substring(text.IndexOf(char.Parse(hash)) + hash.Length, 
     text.IndexOf(char.Parse(x), text.IndexOf(char.Parse(hash))) - (text.IndexOf(char.Parse(hash)) + hash.Length)).Trim(); 
Console.WriteLine(clean_text); 

SSIS

RTRIM(SUBSTRING(CreatedBy, FINDSTRING(CreatedBy, "#", 1) + LEN("#"), FINDSTRING(CreatedBy, "(X)", 1) - (FINDSTRING(CreatedBy, "#", 1) + LEN("#")))) 

SSIS mit oder ohne (X)

FINDSTRING(CreatedBy,"(X)",1) > 0 ? RTRIM(SUBSTRING(CreatedBy,FINDSTRING(CreatedBy,"#",1) + LEN("#"),FINDSTRING(CreatedBy,"(X)",1) - (FINDSTRING(CreatedBy,"#",1) + LEN("#")))) : RTRIM(SUBSTRING(CreatedBy,FINDSTRING(CreatedBy,"#",1) + LEN("#"), LEN(CreatedBy)+1 - (FINDSTRING(CreatedBy,"#",1) + LEN("#")))) 
+0

Danke R. Richards. Haben Sie die Lösung, die die abgeleitete Spalte in SSIS verwendet? – Rocky

+0

Ich habe hinzugefügt, aber ich weiß nicht, wie man es ohne eine Menge Aufwand zu testen. Sie müssen möglicherweise mit der Formel herumspielen. –

+0

Thx, es hat funktioniert. Zumindest wird der Ausdruck jetzt akzeptiert. Allerdings bekomme ich diese kryptische Fehlermeldung: Fehler: 0xC0209029 bei Datenfluss-Task, abgeleitete Spalte [16]: SSIS-Fehlercode DTS_E_INDUCEDTRANSFORMFAILUREONERROR. Die "Abgeleitete Spalte" ist fehlgeschlagen, weil der Fehlercode 0xC0049067 aufgetreten ist, und die Anordnung der Fehlerzeilen unter "Abgeleitete Spalteneingaben [Abgeleitete Spalteneingabe]. Spalten [Kopie von Erstellt von]" gibt einen Fehler bei einem Fehler an. Beim angegebenen Objekt der angegebenen Komponente ist ein Fehler aufgetreten. Wenn ich die Fehlerausgabe auf "Fehler ignorieren" konfiguriere, werden NULL anstelle des transformierten Werts geschrieben. – Rocky

0

Sie haben gesagt:

Basically, I want to remove 1;# from the left and spaces and (X) after the name ends...I want to do this using the Derived Column component in SSIS

Expression in Transformation für abgeleitete Spalten von der Quelle zum Ziel:

REPLACE (ERSETZEN (REPLACE (ERSETZEN (REPLACE (Sample, "1", ""), ";",“ ")," # " ""), "(X)", ""),"“, "")

Von: 1; #Jackson, Michael (X)

An: Jackson, MichaelTo: Jackson, Michael

+0

Thx, das funktioniert auch – Rocky