sql >> データベース >  >> RDS >> Sqlserver

T-SQLでXML列の属性をピボットするにはどうすればよいですか

    この動的ピボット をご覧ください。 最近では、これ -基本的に、SELECT DISTINCT FieldNameができる必要があります この手法を使用してクエリを動的に構築します。

    特定の問題に対する完全な答えは次のとおりです(列が表示される順序を知る際に、個別の属性からリストを生成する場合、列の順序に弱点があることに注意してください):

    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. SQL*Plusスクリプトが2回実行されました

    2. SQLサーバーで数字を単語に変換できる組み込み関数はありますか

    3. CrystalReportsのデータプロバイダーの更新

    4. XAMPPとMysqlWorkbenchを一緒に使用する