В качестве альтернативы вы можете попробовать это:.
- таблица макетов с некоторыми тестовыми данными для имитации вашей проблемы
DECLARE @mockupTable TABLE (ID INT IDENTITY, YourColumn VARCHAR(50));
INSERT INTO @mockupTable VALUES
('H-01-01-02-01')
,('BLE-01-03-01')
,('H-02-05-1.1-03');
- запрос
SELECT CastedToXml.value('/x[sql:column("CountOfFragments")-1][1]','nvarchar(10)') AS TheWantedFragment
FROM @mockupTable t
CROSS APPLY(SELECT CAST('<x>' + REPLACE(t.YourColumn,'-','</x><x>') + '</x>' AS XML))A(CastedToXml)
CROSS APPLY(SELECT CastedToXml.value('count(/x)','int')) B(CountOfFragments);
Идея вкратце:
Первый APPLY
преобразует строку в XML, подобный этому
<x>H</x>
<x>01</x>
<x>01</x>
<x>02</x>
<x>01</x>
Второй APPLY
сделает запрос в этот XML, чтобы получитьколичество фрагментовПоскольку APPLY
добавит это как столбец к результирующему набору, мы можем использовать значение, используя sql:column()
, чтобы получить искомый фрагмент по его позиции.