sql >> Databáze >  >> RDS >> Sqlserver

Jak mohu pivotovat atributy sloupce XML v T-SQL

Podívejte se na tento dynamický pivot a nověji tento - v podstatě musíte být schopni SELECT DISTINCT FieldName použít tuto techniku ​​k dynamickému sestavení dotazu.

Zde je úplná odpověď na váš konkrétní problém (všimněte si, že při generování seznamu z různých atributů existuje slabé místo v pořadí sloupců, protože víte, v jakém pořadí by se sloupce měly objevit):

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. Je tento dotaz bezpečný před sql injection?

  2. Operátory SET v SQL

  3. Chyba nesouladu Oracle.DataAccess

  4. Údržba systémových databází serveru SQL Server