Sql server 如何使用SQL Server上的XQuery返回某些顺序同级节点?
给定以下代码段,我需要一个查询,返回“a”节点的文本和“b”节点后第一个节点的文本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>
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
节点