Вы можете пойти другим путем:
DECLARE @mockup TABLE(SomeValue VARCHAR(100));
INSERT INTO @mockup VALUES('AB: ABC-ABCDE')
,('CD: blah-blub')
,('Wrong Value here')
,('MissingEnd: isCorrect');
- запрос выберет второй элемент из XML.
SELECT CAST('<x>' + REPlACE(REPLACE(m.SomeValue,'-',' '),' ','</x><x>') + '</x>' AS XML).value('/x[2]','nvarchar(max)')
FROM @mockup m;
Хитрость: использовать некоторые замены для преобразованияваш AB: ABC-ABCDE в XML, подобный
<x>AB:</x>
<x>ABC</x>
<x>ABCDE</x>
Из этого XML мы можем легко выбрать второй элемент.
Один положительный побочный эффект: этот подходгораздо более терпимо с плохими значениями ...
ОБНОВЛЕНИЕ
Ваши плохие значения ... Новый трюк состоит в том, чтобы вырезать все до двойной точки, используя STUFF()
:
DECLARE @mockup TABLE(SomeValue VARCHAR(100));
INSERT INTO @mockup VALUES('AB: ABC-ABCDE')
,('CD: blah-blub')
,('Wrong Value here')
,('MissingEnd: isCorrect')
,('ABC-ABC: ABCDEFG-ABCDEF GH');
SELECT CAST('<x>' + REPlACE(REPLACE(STUFF(m.SomeValue,1,CHARINDEX(':',m.SomeValue),''),'-',' '),' ','</x><x>') + '</x>' AS XML).value('/x[2]','nvarchar(max)')
FROM @mockup m;