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

1 行テーブルをキーと値のペア テーブルにフラット化する

    ダイナミクスが含まれていないバージョン。 XML で要素名として使用するのに無効な列名がある場合、これは失敗します。

    select T2.N.value('local-name(.)', 'nvarchar(128)') as [Key],
           T2.N.value('text()[1]', 'nvarchar(max)') as Value
    from (select *
          from TableA
          for xml path(''), type) as T1(X)
      cross apply T1.X.nodes('/*') as T2(N)
      

    作業サンプル:

    declare @T table
    (
      Column1 varchar(10), 
      Column2 varchar(10), 
      Column3 varchar(10)
    )
    
    insert into @T values('V1','V2','V3')
    
    select T2.N.value('local-name(.)', 'nvarchar(128)') as [Key],
           T2.N.value('text()[1]', 'nvarchar(max)') as Value
    from (select *
          from @T
          for xml path(''), type) as T1(X)
      cross apply T1.X.nodes('/*') as T2(N)
      

    結果:

    Key                  Value
    -------------------- -----
    Column1              V1
    Column2              V2
    Column3              V3
      

    更新

    複数のテーブルを含むクエリの場合、for xml auto を使用できます XML でテーブル名を取得します。クエリでテーブル名にエイリアスを使用すると、代わりにエイリアスが取得されることに注意してください。

    select X2.N.value('local-name(..)', 'nvarchar(128)') as TableName,
           X2.N.value('local-name(.)', 'nvarchar(128)') as [Key],
           X2.N.value('text()[1]', 'nvarchar(max)') as Value
    from (
         -- Your query starts here
         select T1.T1ID,
                T1.T1Col,
                T2.T2ID,
                T2.T2Col
         from T1
           inner join T2
             on T1.T1ID = T2.T1ID
         -- Your query ends here
         for xml auto, elements, type     
         ) as X1(X)
      cross apply X1.X.nodes('//*[text()]') as X2(N)
      

    SQL フィドル



    1. SQLクエリをHTMLテーブルに出力します

    2. tag_nameとtag_valueを使用してJSONbをXMLにPostgres

    3. 互換性のあるORA-16484のためにアーカイバがハングしました

    4. MYSQLクエリから列の平均を計算する