Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie schwenke ich auf die Attribute einer XML-Spalte in T-SQL

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)