Sqlserver
 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 Fiddle



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да направите CONTAINS() на две колони на SQL за търсене в индекс на пълен текст

  2. Entity Framework/Linq към SQL:Пропуснете и вземете

  3. ORDER BY ... COLLATE в SQL Server

  4. Копиране на редове в база данни, когато редовете имат деца

  5. SQL Server не освобождава памет след изпълнение на заявката