;with CTE as
(
Select ID, LEFT(Data, CHARINDEX(';',Data+';')-1),
STUFF(Data, 1, CHARINDEX(';',Data+';'), '')
from temp_res
union all
select ID, LEFT(Data, CHARINDEX(';',Data+';')-1),
STUFF(Data, 1, CHARINDEX(';',Data+';'), '')
from CTE
where Data > ''
)
Select * from CTE
Order by ID