Bekijk deze dynamische spil
en meer recentelijk deze
- u moet in principe SELECT DISTINCT FieldName
. kunnen om deze techniek te gebruiken om uw zoekopdracht dynamisch op te bouwen.
Hier is het volledige antwoord voor uw specifieke probleem (merk op dat er een zwakte is in de kolomvolgorde bij het genereren van de lijst op basis van de afzonderlijke attributen om te weten in welke volgorde de kolommen moeten verschijnen):
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)