Ну например как-то так:
select Row_Number() OVER (order by TT.ID, GLFS.ID)
,ParentID = case when GLFS.ID != 1
then Row_Number() OVER (order by TT.ID) - 1
else null end
,GLFS.Value
from TestTable TT
cross apply dbo.GetListValueFromString(TT.Stroke, ';') as GLFS
где GetListFromString - функция которая парсит строку через разделитель И выдает два поля: (ID, подстрока), где ID - порядковый номер подстроки в строке. Примеров такой функции море - ищите.