【问题标题】:how to find ancestors in XML using XQuery-sql如何使用 XQuery-sql 在 XML 中查找祖先
【发布时间】:2015-11-02 02:53:35
【问题描述】:

我正在处理一些 xml 列,并使用 XQuery 查找特定子项(子项 E)的第一个最近的祖先(B),但出现此错误:

消息 9335,级别 16,状态 1,第 16 行 XQuery [query()]:XQuery 不支持语法“祖先”。

祖先和后代的深度级别不是静态的,我希望结果为“B2” 我试过了

    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)')

你能帮帮我吗?

【问题讨论】:

  • 你知道B和E之间有多少级吗?
  • 不,我不知道,谢谢你的回答

标签: sql-server xml sql-server-2008 tsql xquery


【解决方案1】:
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】:

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

    SELECT @x.query('data(//B[.//E][not(.//B)]/@name)')
    

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

    • [.//E] :确保目标 B 元素具有后代元素 E
    • [not(.//B)] :确保目标 B 元素没有后代元素 B,换句话说,目标 B 元素必须是最内层的 B 元素具有后代 E

    【讨论】:

    • @SarahAllen 如果它解决了相关问题,请不要忘记accept the answer。谢谢
    • 对不起,我不知道如何接受,谢谢你让我知道
    猜你喜欢
    • 1970-01-01
    • 2012-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 1970-01-01
    相关资源
    最近更新 更多