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

Làm phẳng bảng 1 hàng thành bảng cặp khóa-giá trị

Một phiên bản mà không có động lực liên quan. Nếu bạn có tên cột không hợp lệ để sử dụng làm tên phần tử trong XML, điều này sẽ không thành công.

select T2.N.value('local-name(.)', 'nvarchar(128)') as [Key],
       T2.N.value('text()[1]', 'nvarchar(max)') as Value
from (select *
      from TableA
      for xml path(''), type) as T1(X)
  cross apply T1.X.nodes('/*') as T2(N)

Một mẫu làm việc:

declare @T table
(
  Column1 varchar(10), 
  Column2 varchar(10), 
  Column3 varchar(10)
)

insert into @T values('V1','V2','V3')

select T2.N.value('local-name(.)', 'nvarchar(128)') as [Key],
       T2.N.value('text()[1]', 'nvarchar(max)') as Value
from (select *
      from @T
      for xml path(''), type) as T1(X)
  cross apply T1.X.nodes('/*') as T2(N)

Kết quả:

Key                  Value
-------------------- -----
Column1              V1
Column2              V2
Column3              V3

Cập nhật

Đối với truy vấn có nhiều bảng, bạn có thể sử dụng for xml auto để lấy tên bảng trong XML. Lưu ý, nếu bạn sử dụng bí danh cho tên bảng trong truy vấn, bạn sẽ nhận được bí danh thay thế.

select X2.N.value('local-name(..)', 'nvarchar(128)') as TableName,
       X2.N.value('local-name(.)', 'nvarchar(128)') as [Key],
       X2.N.value('text()[1]', 'nvarchar(max)') as Value
from (
     -- Your query starts here
     select T1.T1ID,
            T1.T1Col,
            T2.T2ID,
            T2.T2Col
     from T1
       inner join T2
         on T1.T1ID = T2.T1ID
     -- Your query ends here
     for xml auto, elements, type     
     ) as X1(X)
  cross apply X1.X.nodes('//*[text()]') as X2(N)

SQL Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MS SQL Server trên Linux và Windows Kiểm tra hiệu suất để phát hiện sự khác biệt

  2. Làm thế nào để kiểm tra xem một cơ sở dữ liệu và các bảng có tồn tại trong máy chủ sql trong một dự án vb .net hay không?

  3. Truyền trực tuyến hình ảnh dựa trên dữ liệu bằng HttpHandler

  4. Sử dụng SSIS, Làm cách nào để tìm các thành phố có dân số đông nhất?

  5. Ngoại lệ 0x80040154 được tạo trong khi thực thi một gói ssis đơn giản trong môi trường MS SQL 2008R2