首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用XQuery-sql在XML中查找祖先

如何使用XQuery-sql在XML中查找祖先
EN

Stack Overflow用户
提问于 2015-08-10 08:54:48
回答 2查看 1.2K关注 0票数 4

我正在处理一些xml列,并使用XQuery查找特定子(子E)的第一个最近的祖先(B),但是这个错误会发生:

MSG9335,级别16,状态1,第16行XQuery查询():不支持XQuery语法“祖先”。

祖先和后代的深度水平不是静态的,我希望结果是"B2“,我已经尝试过了。

代码语言:javascript
复制
    DECLARE @x xml
SET @x = CAST(
'<A>
    <B name="B1">
        <C>
            <B id="1" name="B2">
                <D id="1.1" name="D1">
                    <E id="1" />
                    <E id="2" />
                </D>
            </B>
        </C>
    </B>    
</A>' AS xml)

SELECT @x.query('data(//E/ancestor::B[1]/@name)')

你能帮帮我吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-10 09:11:41

您可以尝试使用不同的方法来避免调用ancestor轴,例如:

代码语言:javascript
复制
SELECT @x.query('data(//B[.//E][not(.//B)]/@name)')

关于正在使用的谓词的简要说明:

  • [.//E]:确保目标B元素具有子代元素E
  • [not(.//B)]:确保目标B元素没有子代元素B,换句话说,目标B元素必须是具有子代E的最内部的B元素。
票数 3
EN

Stack Overflow用户

发布于 2015-08-10 09:05:41

代码语言:javascript
复制
DECLARE @h int

DECLARE @x xml
SET @x = CAST(
'<A>
    <B name="B1">
        <C>
            <B id="1" name="B2">
                <D id="1.1" name="D1">
                    <E id="1" />
                    <E id="2" />
                </D>
            </B>
        </C>
    </B>    
</A>' AS xml)

EXEC sp_xml_preparedocument @h OUTPUT, @x

SELECT eId, bName
FROM OPENXML(@h, '//E', 2)
WITH 
(
    eId varchar(5) '@id', 
    bName varchar(5) 'ancestor::B[1]/@name')

EXEC sp_xml_removedocument @h
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31915374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档