2016-02-27 13 views
1
DECLARE @XML XML 
SET @xml = ' 
<root> 
<a> 
<b nm="DATE OF BIRTH"> 19871224</b> 
<b nm="DRIVER"> MIKE </b> 
</a> 
<a> 
<b nm="DATE OF BIRTH"> 19881124</b> 
<b nm="DRIVER"> TOM </b> 
</a> 
<a> 
<b nm="DATE OF BIRTH"> 19770601</b> 
<b nm="DRIVER"> DAVID </b> 
</a> 
</root>' 

select 
    pd.value('//b[@nm="DATE OF BIRTH"][1]','varchar(100)') 
from 
    @xml.nodes('//a') as x(Rec) 
cross apply 
    @xml.nodes('//a/b') as i(pd) 

我想通过使用XQUERY解析简单。我总是得到这样的错误。我挣扎了好几天。原因是列名是一个属性。谢谢。Xquery需要一个单例:列名是属性

消息2389,级别16,状态1,行23
的XQuery [值()]: '值()' 需要单(或空序列),实测值类型的操作数 'XDT:untypedAtomic类型*'

我想收到的结果是

DATE_OF_BIRTH  DRIVER 
--------------------------- 
19871224   MIKE 
19881124   TOM 
19770601   DAVID 

回答

2

试试这个:

select 
    Date_of_Birth = pd.value('(b[@nm="DATE OF BIRTH"])[1]', 'varchar(50)'), 
    Driver = pd.value('(b[@nm="DRIVER"])[1]', 'varchar(50)') 
from 
    @xml.nodes('/root/a') as i(pd) 

基本上,您选择<root>下的所有<a>元素,并且为每个元素使用两个@nm属性中的任何一个来获取包含的<b>元素以获取详细信息。

为我生成所需的输出。

+1

非常感谢您的回答。有用。周末愉快! – Mike