Я думаю, что это, вероятно, достаточно близко к тому, что вы хотите:
select t.*, s.*
from t cross apply
(select max(case when seqnum = 1 then s.value end) as test_1,
max(case when seqnum = 2 then s.value end) as test_2,
max(case when seqnum = 3 then s.value end) as test_3
from (select s.value,
row_number() over (order by charindex(';' + s.value + ';', ';' + t.tests + ';')) as seqnum
from string_split(t.tests, ';') s
) s
) s;
Здесь - скрипка db <>.
Примечание: этот подход не будет работать, если в столбце есть дубликаты.