Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come faccio a ruotare sugli attributi di una colonna XML in T-SQL

Dai un'occhiata a questo pivot dinamico e più recentemente questo - in pratica devi essere in grado di SELECT DISTINCT FieldName per utilizzare questa tecnica per creare la tua query in modo dinamico.

Ecco la risposta completa per il tuo problema particolare (nota che c'è una debolezza nell'ordine delle colonne quando si genera l'elenco dagli attributi distinti nel sapere in quale ordine dovrebbero apparire le colonne):

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)