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

Hvordan pivoterer jeg på en XML-kolonnes attributter i T-SQL

Tag et kig på denne dynamiske pivot og for nylig denne - du skal grundlæggende være i stand til at SELECT DISTINCT FieldName at bruge denne teknik til at bygge din forespørgsel dynamisk.

Her er det fulde svar på dit specifikke problem (bemærk, at der er en svaghed i kolonnerækkefølgen, når du genererer listen ud fra de forskellige attributter for at vide, hvilken rækkefølge kolonnerne skal vises):

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)


  1. MySQL - Vælg fra en liste over tal dem uden modstykke i id-feltet i en tabel

  2. Logik for allerede eksisterende registreringskontrol, men kun i tilfælde af opdaterede formularværdier

  3. Oracle trimspool kun efterfølgende emner (ikke førende emner)

  4. MySQL tidsstempelforskel