Я не уверен, является ли это дубликатом вашего другого вопроса, но он, безусловно, имеет тот же ответ:
with cte as (
select id, convert(varchar(max), null) as name, convert(varchar(max), null) as phone, convert(varchar(max), null) as email,
convert(varchar(max), names + ',') as names_rest,
convert(varchar(max), phones + ',') as phones_rest,
convert(varchar(max), emails + ',') as emails_rest,
0 as lev
from t
union all
select id, left(names_rest, charindex(',', names_rest) - 1),
left(phones_rest, charindex(',', phones_rest) - 1),
left(emails_rest, charindex(',', emails_rest) - 1),
stuff(names_rest, 1, charindex(',', names_rest), ''),
stuff(phones_rest, 1, charindex(',', phones_rest), ''),
stuff(emails_rest, 1, charindex(',', emails_rest), ''),
lev + 1
from cte
where names_rest like '%,%'
)
select id, name, phone, email
from cte
where lev > 0;
Здесь - это db <> скрипка.