sql >> Database >  >> RDS >> Sqlserver

Hoe draai ik op de attributen van een XML-kolom in T-SQL

Bekijk deze dynamische spil en meer recentelijk deze - u moet in principe SELECT DISTINCT FieldName . kunnen om deze techniek te gebruiken om uw zoekopdracht dynamisch op te bouwen.

Hier is het volledige antwoord voor uw specifieke probleem (merk op dat er een zwakte is in de kolomvolgorde bij het genereren van de lijst op basis van de afzonderlijke attributen om te weten in welke volgorde de kolommen moeten verschijnen):

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. T-SQL om alle gebruikerstoewijzingen met databaserollen/machtigingen voor een login weer te geven

  2. Hoe meerdere records (rij) uit een kolom in mysql te selecteren?

  3. Rapport maken in Java met JDBC en proberen om te converteren tussen SQL-datum en Java-gebruiksdatum

  4. Punten en komma's uit kolomwaarden verwijderen