Мы на 2012 используем:
CREATE FUNCTION [dbo].[CalcHelperString_Split]
(
@str VARCHAR(MAX),
@delimiter VARCHAR(10)
)
RETURNS TABLE
AS
RETURN
SELECT t.c.value('(./text())[1]', 'VARCHAR(MAX)') as item
FROM
(
SELECT x = CONVERT(XML, '<i>' + REPLACE(@str, @delimiter, '</i><i>') + '</i>').query('.')
) a
CROSS APPLY x.nodes('i') t(c)
WHERE t.c.value('(./text())[1]', 'VARCHAR(MAX)') is not null;
GO
Было найдено на просторах StackOverflow. Работает быстрее всего, что мы смогли найти.
Поэтому касательно вашего запроса можно сделать так:
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;')
SELECT * FROM @TTT t
CROSS APPLY dbo.CalcHelperString_Split(t.column2, ';') f