sql >> Database >  >> RDS >> Sqlserver

Attributen extraheren uit XML-velden in SQL Server 2008-tabel

Net nadat ik de vraag had gepost, kwam ik deze antwoord . Ik weet niet waarom ik het bij eerdere zoekopdrachten niet kon vinden. Het was het antwoord waar ik naar op zoek was. Dit is de zoekopdracht die werkt:

Zoekopdracht

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

Resultaat

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

.

------ Bewerken [29-01-2014] ------

Ik vond nog een geval dat de moeite waard is om aan dit antwoord toe te voegen. Gegeven meerdere <info> elementen binnen de <data> element, is het mogelijk om alle <info> . terug te geven knooppunten met behulp van 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

Dit voorbeeld retourneert de volgende dataset:

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. Hoe repliceer je alleen INSERT's en niet DELETEs/UPDATEs op Slony Slave Node?

  2. Hoe controleer ik of een gebruiker SSL nodig heeft in Mysql?

  3. Activeer SQL Trigger alleen wanneer een bepaalde gebruiker de rij bijwerkt

  4. Maak verbinding met Oracle zonder tnsname.ora