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

Wyodrębnianie atrybutów z pól XML w tabeli SQL Server 2008

Zaraz po wysłaniu pytania natknąłem się na ten odpowiedź . Nie wiem, dlaczego nie mogłem go znaleźć we wcześniejszych wyszukiwaniach. To była odpowiedź, której szukałem. Oto zapytanie, które działa:

Zapytanie

select Name
      ,xml_data.value('(/data/info/@x)[1]', 'int') as [Info.x]
      ,xml_data.value('(/data/info/@y)[1]', 'int') as [Info.y]
      ,xml_data.value('(/data/info/.)[1]', 'varchar(10)') as [Info]
from   #temp

Wynik

Name     Info.x    Info.y    Info
-------  --------  --------  ---------
one         42        99     Red
two         27        72     Blue
three       16        51     Green
four        12        37     Yellow

.

------ Edytuj [2014-01-29] ------

Znalazłem inny przypadek, który warto dodać do tej odpowiedzi. Podano wiele <info> elementy w <data> element, możliwe jest zwrócenie wszystkich <info> węzły za pomocą cross apply :

create table #temp (id int, name varchar(32), xml_data xml)

insert into #temp values
(1, 'one',   '<data><info x="42" y="99">Red</info><info x="43" y="100">Pink</info></data>'),
(2, 'two',   '<data><info x="27" y="72">Blue</info><info x="28" y="73">Light Blue</info></data>'),
(3, 'three', '<data><info x="16" y="51">Green</info><info x="17" y="52">Orange</info></data>'),
(4, 'four',  '<data><info x="12" y="37">Yellow</info><info x="13" y="38">Purple</info></data>')

select Name
      ,C.value('@x', 'int') as [Info.x]
      ,C.value('@y', 'int') as [Info.y]
      ,C.value('.', 'varchar(10)') as [Info]
from #temp cross apply
     #temp.xml_data.nodes('data/info') as X(C)

drop table #temp

Ten przykład zwraca następujący zbiór danych:

Name      Info.x      Info.y      Info
--------- ----------- ----------- ----------
one       42          99          Red
one       43          100         Pink
two       27          72          Blue
two       28          73          Light Blue
three     16          51          Green
three     17          52          Orange
four      12          37          Yellow
four      13          38          Purple



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wysłać zapytanie do tego wyniku na serwerze SQL?

  2. Niebezpieczeństwo używania „IF EXISTS... UPDATE .. ELSE .. INSERT” i jaka jest alternatywa?

  3. Łamigłówka impasu:ofiara nie posiada żadnego zasobu używanego do zabijania w celu rozwiązania impasu

  4. Odpytywanie zaszyfrowanych wartości w bazie danych

  5. SQL Server Alokacja kwoty na rachunku