Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Spłaszczenie tabeli z 1 wierszem na tabelę par klucz-wartość

Wersja, w której nie ma elementów dynamicznych. Jeśli masz nazwy kolumn, których nie można użyć jako nazw elementów w XML, to się nie powiedzie.

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)

Próbka robocza:

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)

Wynik:

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

Aktualizacja

W przypadku zapytania z więcej niż jedną tabelą możesz użyć for xml auto aby uzyskać nazwy tabel w XML. Zauważ, że jeśli użyjesz aliasu dla nazw tabel w zapytaniu, zamiast tego otrzymasz 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Utworzyć użytkownika dla SQL Server 2008?

  2. SQL 2008:Wyłącz słowa stop dla zapytania wyszukiwania pełnotekstowego

  3. Przywracanie bazy danych SQL Server — klucz główny nie otwiera się

  4. Procedura składowana z nazwą tabeli jako parametrem

  5. Wybierz unikalne nazwy kolumn z listy połączonych tabel