Xquery 需要单例:列名是一个属性

Mik*_*ke 3 xml sql-server xquery

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)
Run Code Online (Sandbox Code Playgroud)

我想通过使用 XQUERY 来解析简单的内容。我总是遇到这样的错误。我为此挣扎了好几天。原因是列名是一个属性。谢谢。

消息 2389,级别 16,状态 1,第 23 行
XQuery [value()]:“value()”需要单例(或空序列),找到类型为“xdt:untypedAtomic *”的操作数

我想要收到的结果是

DATE_OF_BIRTH     DRIVER
---------------------------
19871224           MIKE
19881124           TOM
19770601           DAVID
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 5

尝试这个:

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)
Run Code Online (Sandbox Code Playgroud)

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

为我产生所需的输出。