Sehen Sie sich diesen dynamischen Drehpunkt
an und neuerdings dieses hier
- Sie müssen grundsätzlich in der Lage sein, SELECT DISTINCT FieldName
um diese Technik zu verwenden, um Ihre Abfrage dynamisch zu erstellen.
Hier ist die vollständige Antwort für Ihr spezielles Problem (beachten Sie, dass es eine Schwachstelle bei der Spaltenreihenfolge gibt, wenn Sie die Liste aus den unterschiedlichen Attributen erstellen, wenn Sie wissen, in welcher Reihenfolge die Spalten erscheinen sollen):
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)