Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Извличане на атрибути от XML полета в таблица на SQL Server 2008

Точно след като публикувах въпроса, попаднах на този отговор . Не знам защо не можах да го намеря при предишни търсения. Това беше отговорът, който търсех. Ето заявката, която работи:

Заявка

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

Резултат

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

.

------ Редактиране [2014-01-29] ------

Намерих още един случай, който си струва да се добави към този отговор. Има множество <info> елементи в <data> елемент, е възможно да се върнат всички <info> възли чрез използване на 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

Този пример връща следния набор от данни:

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. Използвайте RAND() в User Defined Function

  2. Създайте изчислена колона в SQL Server с помощта на T-SQL

  3. SQL Server 2008:изтриване на дублирани редове

  4. Мога ли да посоча входен sql файл с bcp?

  5. Защо моето ляво присъединяване на t-sql не работи?