sql >> Databasteknik >  >> RDS >> Sqlserver

Plattning av en tabell med 1 rad till en nyckel-värde partabell

En version där det inte finns någon dynamik. Om du har kolumnnamn som är ogiltiga att använda som elementnamn i XML kommer detta att misslyckas.

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)

Ett fungerande exempel:

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)

Resultat:

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

Uppdatera

För en fråga med mer än en tabell kan du använda for xml auto för att få tabellnamnen i XML. Observera att om du använder alias för tabellnamn i frågan får du istället aliaset.

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. Räkna ordförekomster i en tabellkolumn

  2. INFOGA... VÄLJ... VAR... PÅ DUBLIKAT... mysql-fråga

  3. Beverly Hills 90210 och ZIP+4:Hantering av adresser i datamodeller

  4. Rails, MySQL och Snow Leopard