इस डायनामिक पिवट
पर एक नज़र डालें और हाल ही में यह वाला
- आपको मूल रूप से SELECT DISTINCT FieldName
. में सक्षम होना चाहिए अपनी क्वेरी को गतिशील रूप से बनाने के लिए इस तकनीक का उपयोग करने के लिए।
यहां आपकी विशेष समस्या का पूरा उत्तर दिया गया है (ध्यान दें कि कॉलम को किस क्रम में प्रदर्शित होना चाहिए, यह जानने में विशिष्ट विशेषताओं से सूची बनाते समय कॉलम ऑर्डर की कमजोरी होती है):
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)