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

Zploštění tabulky o 1 řádku do tabulky párů klíč-hodnota

Verze, kde není zapojena žádná dynamika. Pokud máte názvy sloupců, které nelze použít jako názvy prvků v XML, toto selže.

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)

Pracovní ukázka:

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)

Výsledek:

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

Aktualizovat

Pro dotaz s více než jednou tabulkou můžete použít for xml auto získat názvy tabulek v XML. Všimněte si, že pokud pro názvy tabulek v dotazu použijete alias, získáte místo něj alias.

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 Fiddle



  1. Jak seskupit podle části řetězce v MySQL

  2. Získání definic programovacích objektů ORACLE

  3. ALTER dotaz velmi pomalý na malé tabulce v PostgreSQL

  4. postgresql jsonb dotaz bez ohledu na velikost písmen