Вы можете разбить строку и выполнить условное агрегирование в пределах CROSS APPLY
Пример
Declare @YourTable Table ([descriptiona] varchar(50)) Insert Into @YourTable Values
('#*Summary: data1 #*Steps: data2 #*Result: data3')
,('#*Steps: data5 #*Summary: data6 #*Result: data4')
Select B.*
From @YourTable
Cross Apply ( Select Summary= stuff(max(case when charindex('Summary:',value)>0 then Value end),1,10,'')
,Steps = stuff(max(case when charindex('Steps:',value)>0 then Value end) ,1,8,'')
,Result = stuff(max(case when charindex('Result:',value)>0 then Value end) ,1,9,'')
From string_split([descriptiona],'#')
) B
Возвращает
Summary Steps Result
data1 data2 data3
data6 data5 data4
EDIT - 2012 Нефункциональная альтернатива
Declare @YourTable Table ([descriptiona] varchar(50)) Insert Into @YourTable Values
('#*Summary: data1 #*Steps: data2 #*Result: data3')
,('#*Steps: data5 #*Summary: data6 #*Result: data4')
Select B.*
From @YourTable
Cross Apply ( Select Summary= stuff(max(case when charindex('Summary:',value)>0 then Value end),1,10,'')
,Steps = stuff(max(case when charindex('Steps:',value)>0 then Value end) ,1,8,'')
,Result = stuff(max(case when charindex('Result:',value)>0 then Value end) ,1,9,'')
From (
Select seq = row_number() over (order by 1/0)
,value = ltrim(rtrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>' + replace((Select replace([descriptiona],'#','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
) B1
) B