sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo giro sobre los atributos de una columna XML en T-SQL?

Eche un vistazo a este pivote dinámico y más recientemente este - básicamente necesita poder SELECT DISTINCT FieldName usar esta técnica para construir su consulta dinámicamente.

Aquí está la respuesta completa para su problema particular (tenga en cuenta que hay una debilidad en el orden de las columnas cuando se genera la lista a partir de los distintos atributos para saber en qué orden deben aparecer las columnas):

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)