Bạn có thể thấy điều này hoạt động trên SQL Fiddle: http://sqlfiddle.com/#!3/ 8c3ee / 32
Đây là phần thịt của nó:
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;
Tiết lộ đầy đủ - Tôi là tác giả của sqlfiddle.com
Điều này hoạt động bằng cách đầu tiên chuyển đổi mỗi chuỗi dấu phẩy thành một đối tượng XML trông giống như sau:
<root>
<s>
<col name="X">1</col>
</s>
<s>
<col name="Y">2</col>
</s>
....
</root>
Khi tôi có chuỗi ở định dạng đó, tôi sử dụng tùy chọn xquery mà SQL Server 2005 (trở lên) hỗ trợ, đó là .value('(/root/s/col[@name="X"])[1]', 'varchar(20)')
phần. Tôi chọn từng cột tiềm năng riêng lẻ, vì vậy chúng được chuẩn hóa và phổ biến khi có sẵn. Với định dạng chuẩn hóa đó, tôi xác định tập hợp kết quả bằng Biểu thức bảng chung (CTE) mà tôi gọi là 'đã phân tích cú pháp'. CTE này sau đó được kết hợp trở lại trong câu lệnh cập nhật, để các giá trị có thể được điền vào bảng gốc.