Мне показалось, что другие ответы немного сложны для понимания - они, конечно, изящные уловки, но я думаю, что любой, кто придет поддержать их, может быть похож на «аааааа?». Здесь я работаю с индексами запятых (первый индекс строки запятой идет в o1 / n1, вторая запятая идет в o2 / n2) в первом cte, вырезать строку вверх (подстрока между 1 и первой запятой, подстрока между первым и вторая запятая, подстрока после третьей запятой) во втором cte, а затем с помощью пары объединений превратить результаты из 7 столбцов в 3
WITH idxs AS
(
SELECT
id,
order,
name,
CHARINDEX(',', [order]) as o1,
CHARINDEX(',', [order], CHARINDEX(',', [order]) + 1) as o2,
CHARINDEX(',', name) as n1,
CHARINDEX(',', name, CHARINDEX(',', name) + 1) as n2
FROM
t
),
cuts as (
SELECT
id,
SUBSTRING([order], 1, o1-1) as ord1,
SUBSTRING([order], o1+1, o2-o1-1) as ord2,
SUBSTRING([order], o2+1, 4000) as ord3,
SUBSTRING(name, 1, n1-1) as nam1,
SUBSTRING(name, n1+1, n2-n1-1) as nam2,
SUBSTRING(name, n2+1, 4000) as nam3
FROM
idxs
)
SELECT id, ord1 as [order], nam1 as name FROM cuts
UNION ALL
SELECT id, ord2, nam2 FROM cuts
UNION ALL
SELECT id, ord3, nam3 FROM cuts
Обратите внимание, что если в ваших данных иногда есть пробелы, а иногда нет, вы получите выгоду от использования LTRIM / RTRIM в выходных данных
если пробелы всегда присутствуют после запятой, вы также можете настроить индексы подстрок, чтобы вырезать пробелы (любой начальный индекс, равный x + 1, будет равен x + 2, а длина, следовательно, должна быть равна -2)