На другом ресурсе подсказали. Искал вот такую реализацию:
DECLARE @TTT TABLE (column1 VARCHAR(50), column2 VARCHAR(100))
INSERT INTO @TTT (column1, column2)
VALUES('Какие-то данные 1', 'строка1;строка2;строка3;'),
('Какие-то данные 2', 'строка4;строка5;строка6;'),
('Какие-то данные 3', 'строка7;'),
('Какие-то данные 4', 'строка8;строка9;')
;WITH cteData (column1, column2, etalon, level)
AS
(
SELECT column1,
SUBSTRING(REPLACE(column2,' ',''),1,CASE WHEN PATINDEX ( '%;%' , column2 )<>0 THEN PATINDEX ( '%;%' , column2 ) ELSE LEN(column2) END) AS column2,
SUBSTRING(REPLACE(column2,' ',''),PATINDEX ( '%;%' , column2 )+1, LEN(column2)) AS etalon,
0 AS level
FROM @TTT
UNION ALL
SELECT A.column1,
SUBSTRING(CTE.etalon,1,CASE WHEN PATINDEX ( '%;%' , CTE.etalon )<>0 THEN PATINDEX ( '%;%' , CTE.etalon ) ELSE LEN(CTE.etalon) END) AS column2,
CASE WHEN PATINDEX ( '%;%' , CTE.etalon )>0 THEN SUBSTRING(CTE.etalon,PATINDEX ( '%;%' , CTE.etalon )+1, LEN(CTE.etalon)) ELSE '' END AS etalon,
CTE.level+1 AS level
FROM @TTT A
INNER JOIN cteData CTE ON A.column1 = CTE.column1 AND len(CTE.etalon)>0
)
SELECT column1, column2
FROM cteData
ORDER BY column1, level