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

Làm cách nào để xoay quanh các thuộc tính của cột XML trong T-SQL

Hãy xem trục xoay động này và gần đây hơn cái này - về cơ bản bạn cần có khả năng SELECT DISTINCT FieldName sử dụng kỹ thuật này để tạo truy vấn động của bạn.

Đây là câu trả lời đầy đủ cho vấn đề cụ thể của bạn (lưu ý rằng có một điểm yếu về thứ tự cột khi tạo danh sách từ các thuộc tính riêng biệt để biết thứ tự các cột sẽ xuất hiện):

DECLARE @template AS varchar(MAX)
SET @template = 'SELECT 
    FormEntryId
    ,{@col_list}
    ,DateCreated 
FROM FormEntry'

DECLARE @col_template AS varchar(MAX)
SET @col_template = 'FormXML.value(''/Root[1]/Form[1]/FormData[@FieldName="{FieldName}"][1]/@FieldValue'',''varchar(max)'') AS {FieldName}'

DECLARE @col_list AS varchar(MAX)

;WITH FieldNames AS (
    SELECT DISTINCT FieldName
    FROM FormEntry
    CROSS APPLY (
        SELECT X.FieldName.value('@FieldName', 'varchar(255)')
        FROM FormXML.nodes('/Root[1]/Form[1]/FormData') AS X(FieldName)
    ) AS Y (FieldName)
)
SELECT @col_list = COALESCE(@col_list + ',', '') + REPLACE(@col_template, '{FieldName}', FieldName)
FROM FieldNames

DECLARE @sql AS varchar(MAX)
SET @sql = REPLACE(@template, '{@col_list}', @col_list)

EXEC (@sql)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng SELECT SCOPE_IDENTITY () trong ADODB Recordset

  2. UNIQUE - cách để có các hàng duy nhất trong bảng?

  3. Chuyển đổi giá trị cột INT thành một chuỗi trống bằng ISNULL

  4. Sự cố khi tải dữ liệu SQL Data Reader vào DataTable

  5. Quản lý kết nối SQL Server với C #