sql >> Databasteknik >  >> RDS >> Sqlserver

Hur pivoterar jag på en XML-kolumns attribut i T-SQL

Ta en titt på denna dynamiska pivot och på senare tid denna - du måste i princip kunna SELECT DISTINCT FieldName att använda den här tekniken för att skapa din fråga dynamiskt.

Här är det fullständiga svaret för ditt specifika problem (observera att det finns en svaghet i kolumnordningen när du genererar listan från de distinkta attributen för att veta vilken ordning kolumnerna ska visas):

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. Innodb:Kan inte hitta FULLTEXT-index som matchar kolumnlistan vid efterfrågan på mer än 1 kolumn

  2. Django bulk_create med ignorera rader som orsakar IntegrityError?

  3. Vilken MySQL-datatyp som ska användas för att lagra booleska värden

  4. Fråga över flera databaser på samma server