sql >> Databasteknik >  >> RDS >> Sqlserver

Extrahera attribut från XML-fält i SQL Server 2008-tabellen

Precis efter att jag postat frågan snubblade jag över denna svar . Vet inte varför jag inte kunde hitta det i tidigare sökningar. Det var svaret jag letade efter. Här är frågan som fungerar:

Fråga

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

Resultat

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

.

------ Redigera [2014-01-29] ------

Jag hittade ett annat fall som är värt att lägga till detta svar. Givet flera element i element, är det möjligt att returnera alla noder genom att använda cross application :

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

Detta exempel returnerar följande datauppsättning:

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. MySQL:Trunkate Table vs Delete From Table

  2. Vad är det för fel med den här AS3-koden för att kommunicera med en PHP-fil?

  3. MySQL fulltextsökning och SOUNDEX

  4. Kan denna sql-fråga förenklas?