2016-05-10 5 views
1

Я прочитал слева, справа, подстроку, CharIndex, но не смог правильно реализовать решение. Я хочу, чтобы преобразовать:Получение строки между символами с использованием SSIS

1; #Jackson, Майкл (X) To: Джексон, Майкл

В принципе, я хочу, чтобы удалить 1; # слева и пространства и (X) после имени заканчивается. Я не могу использовать любые жестко закодированные числа, так как длина имени и фамилии может отличаться. Не могли бы вы помочь? Я хочу сделать это, используя компонент Derived Column в SSIS.

+0

Является ли ведущий шаблон всегда цифрой-точкой с запятой или он отличается? Является ли trailing pattern всегда открытым? X-closeparen? – billinkc

+0

Вероятно дубликаты [ex1] (http://stackoverflow.com/a/33023858/181965) [ex2] (http://stackoverflow.com/q/31122657/181965) [ex3] (http://stackoverflow.com/a/15176398/181965) – billinkc

+0

@billinkc: Да, ведущий шаблон всегда имеет цифру (s) -семиколон-острый. Обратный паттерн всегда openparen-X-closeparen. – Rocky

ответ

0

Вот несколько возможных решений в зависимости от ваших потребностей.

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 с или без (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

Спасибо Р. Ричардсу. У вас есть решение с использованием Derived Column в SSIS? – Rocky

+0

Я добавил это, но я не знаю, как протестировать его без кучи усилий. Возможно, вам придется играть по формуле. –

+0

Thx, это сработало. По крайней мере, выражение теперь принимается. Тем не менее, я получаю это загадочное сообщение об ошибке: Ошибка: 0xC0209029 в Задаче потока данных, Производный столбец [16]: Код ошибки SSIS DTS_E_INDUCEDTRANSFORMFAILUREONERROR. «Derived Column» failed, потому что произошел код ошибки 0xC0049067, а расположение строки ошибки в «Derived Column.Inputs [Derived Column Input] .Columns [Copy of Created by]» указывает на ошибку при ошибке. Произошла ошибка в указанном объекте указанного компонента. Если я настрою вывод ошибки на «Игнорировать ошибку», вместо преобразованного значения будут записаны NULL. – Rocky

0

Вы сказали:

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

Экспрессия в Derived трансформации Колонка от источника к пункту назначения:

ЗАМЕНЫ (REPLACE (ЗАМЕНИТЬ (REPLACE (ЗАМЕНИТЬ (Образец, "1", ""), ";",» ")," # " ""), "(X)", ""),"», "")

С: 1; #Jackson, Майкл (X)

To: Джексон, MichaelTo: Jackson, Michael

+0

Thx, это тоже работает – Rocky

Смежные вопросы