SQL Server 2008中获取首个Test节点对应V值的XQuery问题
问题描述
我有如下简化的XML数据存储在SQL列中:
<Values> <Value> <N>Test</N> <V>FindMe</V> </Value> <Value> <N>Test</N> <V>NotMe</V> </Value> <Value> <N>Other Value</N> <V>NotMe</V> </Value> </Values>
需要获取第一个<N>节点值为Test的<Value>节点对应的<V>值。由于SQL Server 2008所用的XPath版本不支持following-sibling语法,参考资料尝试用>>运算符编写的查询执行时报错:
XQuery [A.x.query()]: '>>' requires a singleton (or empty sequence), found operand of type 'element(N,xdt:untyped) *'
解决方案
直接定位到第一个满足条件的<Value>节点,再提取其下的<V>节点即可,无需使用>>运算符:
查询XML节点
SELECT A.x, A.x.query('/Values/Value[N = "Test"][1]/V') AS Result FROM ( SELECT CAST('<Values><Value><N>Test</N><V>FindMe</V></Value><Value><N>Other Value</N><V>NotMe</V></Value></Values>' AS XML) x ) A
直接获取文本值
如果需要直接返回<V>的文本内容,使用value()方法更高效:
SELECT A.x, A.x.value('(/Values/Value[N = "Test"][1]/V/text())[1]', 'nvarchar(100)') AS Result FROM ( SELECT CAST('<Values><Value><N>Test</N><V>FindMe</V></Value><Value><N>Other Value</N><V>NotMe</V></Value></Values>' AS XML) x ) A
原理说明
SQL Server 2008的XQuery支持通过路径表达式直接筛选节点:
/Values/Value[N = "Test"][1]精准定位到第一个<N>值为Test的<Value>节点- 后续的
/V直接提取该节点下的<V>元素,完全避开了>>运算符对单例操作数的要求,从根源解决报错问题
内容的提问来源于stack exchange,提问作者Richard Harris
相关产品推荐
相关产品推荐

