Вы можете разделить исходную строку на 2 меньшие части, которые затем могут быть переданы в функцию parsename
, которая может быть полезна для этого. Нам нужно сделать это, потому что parsename
может анализировать только до 4 частей, разделенных символом .
. Таким образом, вы можете сделать
with your_table as (select '111111-LTL-HOU-SALES-EMP-DM' as txt)
select parsename(replace(p1,'-','.'),2),
parsename(replace(p1,'-','.'),1),
parsename(replace(p2,'-','.'),4),
parsename(replace(p2,'-','.'),3),
parsename(replace(p2,'-','.'),2),
parsename(replace(p2,'-','.'),1)
from your_table t1
cross apply (select charindex( '-', txt) as i1) t2 --locate 1st occurrence of -
cross apply (select charindex( '-', txt, (i1 + 1)) as i2 ) t3 --locate 2nd occurrence of -
cross apply (select left( txt,i2-1) as p1) t4 --get all before 2nd occurrence of -
cross apply (select replace(txt,left( txt,i2),'') as p2) t5; --get all after 2nd occurrence of -
Я использую cross apply
, потому что, даже за счет многословия, это делает логику c достижения двух меньших частей более читабельной.
Убедитесь, что отдельные анализируемые части не длиннее 256 символов каждая, и у вас нет .
символов в строке, в противном случае это не сработает, и вам может быть лучше использовать подход, основанный на XML.
DEMO