sql >> Database >  >> RDS >> Sqlserver

Afvlakken van een tabel met 1 rij tot een tabel met sleutel/waarde-paar

Een versie waar geen dynamiek bij komt kijken. Als u kolomnamen heeft die ongeldig zijn om te gebruiken als elementnamen in XML, zal dit mislukken.

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)

Een werkend voorbeeld:

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)

Resultaat:

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

Bijwerken

Voor een zoekopdracht met meer dan één tabel kunt u for xml auto . gebruiken om de tabelnamen in de XML te krijgen. Let op, als u alias gebruikt voor tabelnamen in de query, krijgt u in plaats daarvan de 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. MySQLi update voorbereide verklaring die database niet bijwerkt

  2. Organiseer uw thuiskantoor voor meer productiviteit

  3. MySQL:selecteer alle gegevens tussen het bereik van twee datums

  4. Berekening uitvoeren in standaard MySQL-waarde