2016-02-27 14 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