Так что возьмите копию NGrams8K .Затем вы можете сделать это:
-- sample data
DECLARE @string VARCHAR(8000) =
'C Aleksander Barkov C Nico Hischier UTIL Tyson Jost W Taylor Hall W Evgenii Dadonov W Kyle Palmieri D Kris Letang D Ryan Suter G Casey DeSmith';
-- my solution works except for cases where the upper-case word is more than one char. You'll need to iron that out
SET @string = REPLACE(@string, 'UTIL', 'U');
-- solution
SELECT SUBSTRING(@string, d.pos+2, d.nextPos-d.pos-3)
FROM
(
SELECT
pos = ng.position,
nextPos = LEAD(ng.position,1,8000) OVER (ORDER BY ng.position)
FROM samd.ngrams8K(@string, 2) AS ng
WHERE ng.token COLLATE Latin1_General_BIN LIKE '[A-Z] '
) AS d;
Возвращает:
name
------------------
Aleksander Barkov
Nico Hischier
Tyson Jost
Taylor Hall
Evgenii Dadonov
Kyle Palmieri
Kris Letang
Ryan Suter
Casey DeSmith
Обратите внимание, что для случаев, когда у вас есть все заглавные слова с> 1 символом, вы будетедолжен обновить свою логику.
Обновление (на основе вопроса в комментариях):
Для строки, отформатированной следующим образом (обратите внимание, я опустил последний разделитель): | Eri | Staal | Нико Хишер| Митчелл Марнер | Тейлор Холл | Кайл Палмиери | Джейсон Цукер | Райан Сутер | Уилл Батчер | Кит Кинкейд
Вы можете изменить мой запрос так, чтобы он выглядел так:
DECLARE
@string VARCHAR(8000) = '|Eri|Staal|Nico Hischier|Mitchell Marner|Taylor Hall|Kyle Palmieri|Jason Zucker|Ryan Suter|Will Butcher|Keith Kinkaid',
@delimiter CHAR(1) = '|';
SELECT
sortKey = ng.position,
[name] = SUBSTRING
(
@string,
ng.position+1,
LEAD(ng.position,1,8000) OVER (ORDER BY ng.position)-ng.position-1
--ISNULL(NULLIF(CHARINDEX(@delimiter,@string,ng.position+1),0),8000)-ng.position-1
)
FROM samd.NGrams8K(@string, 1) AS ng
WHERE token = @delimiter;
Обратите внимание, что логикаВыше используется LEAD
, для которого требуется SQL Server 2012+, если вы используете 2008, вы бы раскомментировали строку под ней и удалили строку, которая использует LEAD.Также обратите внимание, что это решение является уменьшенной версией DelimitedSplit8K (решение 2008 года) и DelimitedSplit8k_LEAD (версия, использующая LEAD).
Все это говорит - Если у вас есть контроль над форматом, почему бы не сохранить записи в 3NF ?