Можете да видите това да работи на SQL Fiddle:http://sqlfiddle.com/#!3/ 8c3ee/32
Ето същината на това:
with parsed as (
select
commasepa,
root.value('(/root/s/col[@name="X"])[1]', 'varchar(20)') as X,
root.value('(/root/s/col[@name="Y"])[1]', 'varchar(20)') as Y,
root.value('(/root/s/col[@name="Z"])[1]', 'varchar(20)') as Z,
root.value('(/root/s/col[@name="A"])[1]', 'varchar(20)') as A,
root.value('(/root/s/col[@name="B"])[1]', 'varchar(20)') as B,
root.value('(/root/s/col[@name="C"])[1]', 'varchar(20)') as C,
root.value('(/root/s/col[@name="D"])[1]', 'varchar(20)') as D
FROM
(
select
commasepa,
CONVERT(xml,'<root><s><col name="' + REPLACE(REPLACE(COMMASEPA, '=', '">'),',','</col></s><s><col name="') + '</col></s></root>') as root
FROM
samp
) xml
)
update
samp
set
samp.x = parsed.x,
samp.y = parsed.y,
samp.z = parsed.z,
samp.a = parsed.a,
samp.b = parsed.b,
samp.c = parsed.c,
samp.d = parsed.d
from
parsed
where
parsed.commasepa = samp.commasepa;
Пълно разкриване – аз съм авторът на sqlfiddle.com
Това работи, като първо преобразува всеки низ от запетая в XML обект, който изглежда така:
<root>
<s>
<col name="X">1</col>
</s>
<s>
<col name="Y">2</col>
</s>
....
</root>
След като имам низа в този формат, използвам опциите xquery, поддържани от SQL Server 2005 (и по-нови), което е .value('(/root/s/col[@name="X"])[1]', 'varchar(20)')
част. Избирам всяка от потенциалните колони поотделно, така че да се нормализират и попълват, когато са налични. С този нормализиран формат дефинирам набора от резултати с израз на обща таблица (CTE), който нарекох „анализиран“. Този CTE след това се обединява обратно в израза за актуализиране, така че стойностите да могат да бъдат попълнени в оригиналната таблица.