鉴于以下代码段,我需要一个返回' 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>'
e.g。 -
Animal | Preference
-------|---------------------
cat | Cats don't like milk
dog | Dogs like everything
使用像这样的节点方法 -
SELECT
c.x.value(N'text()[1]','varchar(max)') as animal
--,??? as preference
FROM
@X.nodes('root/a') c(x)
我不认为相邻节点可以从&#39; x&#39;对象,因为它是该点的表变量。显然,XML不是最理想的,因为b节点应该更准确地是节点的子节点,但这就是数据的形状。 SQL Server仅限于XQuery的一个子集,这使得这更加困难。
答案 0 :(得分:1)
对this answer给予应有的感谢,这不是我们需要的,但它确实指向了>>
运营商的方向。
缺乏合适的轴使得这一点更加复杂:
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
节点。