Sql server 如何使用SQL Server上的XQuery返回某些顺序同级节点?

Sql server 如何使用SQL Server上的XQuery返回某些顺序同级节点?,sql-server,xml,xquery,Sql Server,Xml,Xquery,给定以下代码段,我需要一个查询,返回“a”节点的文本和“b”节点后第一个节点的文本 declare @X xml = ' <root> <a>cat</a> <b>Cats don''t like milk</b> <a>dog</a> <c>not this</c> <b>Dogs like everything</b>

给定以下代码段,我需要一个查询,返回“a”节点的文本和“b”节点后第一个节点的文本

declare @X xml = '
<root>
    <a>cat</a>
    <b>Cats don''t like milk</b>
    <a>dog</a>
    <c>not this</c>
    <b>Dogs like everything</b>
    <b>and not this</b>
</root>'
像这样使用nodes方法-

SELECT
    c.x.value(N'text()[1]','varchar(max)') as animal
    --,??? as preference
FROM
    @X.nodes('root/a') c(x)
我不认为相邻节点可以从“x”对象获得,因为它是该点的一个表变量。显然,XML是次优的,因为b节点更准确地说应该是a节点的子节点,但我认为这就是数据的形状。SQL Server仅限于XQuery的一个子集,这使得这一点更加困难。

这是我们所需要的,但它确实为我指明了
操作符的方向

由于缺少合适的轴,这一点变得更加复杂:

SELECT
    c.a.value('text()[1]','varchar(max)') as animal,
    c.a.query('
        let $a := . 
        return (../b[. >> $a][1])/text()'
    ).value('text()[1]','varchar(max)') as preference
FROM 
    @x.nodes('root/a') c(a)
我们必须将
a
节点分配给一个变量,以便能够查询紧随其后的第一个
b
节点