Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chuyển đổi chuỗi được phân tách bằng dấu phẩy thành nhiều cột trong máy chủ sql

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi muốn một kết quả truy vấn chọn lọc ở định dạng bảng như báo cáo tóm tắt

  2. Sử dụng FILEGROUP_NAME () để trả lại tên của nhóm tệp trong SQL Server

  3. Chọn phút DATEADD với truy vấn SQL Server 2008

  4. Làm thế nào để sử dụng một câu lệnh trường hợp trong hàm có giá trị vô hướng trong SQL?

  5. Làm cách nào để tuần tự hóa một đồ thị lớn của đối tượng .NET thành BLOB SQL Server mà không cần tạo bộ đệm lớn?