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)