Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Extrahieren von Attributen aus XML-Feldern in der SQL Server 2008-Tabelle

Kurz nachdem ich die Frage gepostet hatte, stolperte ich über diesen Antwort . Ich weiß nicht, warum ich es in früheren Suchen nicht finden konnte. Es war die Antwort, nach der ich gesucht hatte. Hier ist die Abfrage, die funktioniert:

Abfrage

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

Ergebnis

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

.

------ Bearbeiten [2014-01-29] ------

Ich habe einen weiteren Fall gefunden, der es wert ist, dieser Antwort hinzugefügt zu werden. Mehrere <info> gegeben Elemente innerhalb von <data> -Element ist es möglich, alle <info> zurückzugeben Knoten mithilfe von 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

Dieses Beispiel gibt das folgende Dataset zurück:

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