I have a table with several columns, one of which is a xml
column. I do not have a namespace to use in the query. The XML data is always the same structure for all records.
Contrived Data
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></data>'),
(2, 'two', '<data><info x="27" y="72">Blue</info></data>'),
(3, 'three', '<data><info x="16" y="51">Green</info></data>'),
(4, 'four', '<data><info x="12" y="37">Yellow</info></data>')
Desired Results
Name Info.x Info.y Info
----- ------- ------- -------
one 42 99 Red
two 27 72 Blue
three 16 51 Green
four 12 37 Yellow
Partially Works
select Name, xml_data.query('/data/info/.').value('.', 'varchar(10)') as [Info]
from #temp
It returns the Name
and Info
columns. I cannot figure out how to extract the attribute values without using a namespace. For instance, the following queries returns errors:
Query 1
select Name, xml_data.query('/data/info/@x') as [Info]
from #temp
Msg 2396, Level 16, State 1, Line 12
XQuery [#temp.xml_data.query()]: Attribute may not appear outside of an element
Query 2
select Name, xml_data.value('/data/info/@x', 'int') as [Info]
from #temp
Msg 2389, Level 16, State 1, Line 12
XQuery [#temp.xml_data.value()]: 'value()' requires a singleton (or empty sequence), found operand of type 'xdt:untypedAtomic *'
Query 3
select Name, xml_data.query('/data/info/.').value('@x', 'int') as [Info]
from #temp
Msg 2390, Level 16, State 1, Line 9
XQuery [value()]: Top-level attribute nodes are not supported
Question
How do you write a query to return regular column data, and element + attribute values from an xml
column in the same table?
.value
you have to specify a single value with the xPath expression. You know that there are no more than one value in the XML but SQL Server does not know that so you need to specify that you want the first value found by using[1]
. – Moe