आप इसे 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 सर्वर 2005 (और ऊपर) समर्थन करते हैं, जो कि .value('(/root/s/col[@name="X"])[1]', 'varchar(20)')
अंश। मैं प्रत्येक संभावित कॉलम को व्यक्तिगत रूप से चुनता हूं, इसलिए उपलब्ध होने पर वे सामान्यीकृत और आबादी वाले होते हैं। उस सामान्यीकृत प्रारूप के साथ, मैं परिणाम सेट को एक सामान्य तालिका अभिव्यक्ति (सीटीई) के साथ परिभाषित करता हूं जिसे मैंने 'पार्स' कहा था। इस सीटीई को फिर अपडेट स्टेटमेंट में वापस जोड़ दिया जाता है, ताकि मूल तालिका में मूल्यों को पॉप्युलेट किया जा सके।