sql >> Database teknologi >  >> RDS >> Sqlserver

Udfladning af en tabel med 1 række til en nøgleværdi-partabel

En version, hvor der ikke er nogen dynamik involveret. Hvis du har kolonnenavne, der er ugyldige til at bruge som elementnavne i XML, vil dette mislykkes.

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)

En fungerende prøve:

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

Opdater

For en forespørgsel med mere end én tabel kan du bruge for xml auto for at få tabelnavnene i XML. Bemærk, hvis du bruger alias for tabelnavne i forespørgslen, får du alias i stedet.

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. Tjek, om feltet er numerisk, og udfør derefter sammenligning kun på disse felter i én sætning?

  2. Hent data fra en oracle-database som en CSV-fil (eller ethvert andet brugerdefineret tekstformat)

  3. Rollup-funktion - Erstat NULL

  4. Funktioner vs procedurer i Oracle