【问题标题】:How to get child of xmlelement in sql query without its name?如何在没有名称的sql查询中获取xmlelement的子元素?
【发布时间】:2011-05-14 19:31:17
【问题描述】:

在 sql server xml 列中,我有这样的 xml:

<Test>  
    <Operations>
        <Operations type="OperationSend">
            <OperationSend>                             
                <ToCompanyId>1</ToCompanyId>
                <Date>2011-05-01T00:00:00</Date>                
            </OperationSend>
        </Operations>
        <Operations type="OperationSell">
            <OperationSell>
                <ToCompanyId>33</ToCompanyId>
                <Amount>12</Amount>
            </OperationSell>
        </Operations>
        <Operations type="OperationEdit">
            <OperationEdit>
                <ToCompanyId>12</ToCompanyId>
                <Date>2011-11-01T00:00:00</Date>    
            </OperationEdit>
        </Operations>
    </Operations>
</Test>

我需要从上次操作 (12) 中获取 ToCompanyId。我遇到了这样的事情。应该是什么??? ToCompanyId 可以有任何操作类型。

select testxml.query('(/Test/Operations/Operations)[last()]/???/ToCompanyId') from dbo.MyXmlTable

【问题讨论】:

  • 我建议您接受最佳答案——在这种特定情况下,它由@Mikael Eriksson 给出。

标签: xpath xquery-sql


【解决方案1】:

您可以使用*

select testxml.query('(/Test/Operations/Operations)[last()]/*/ToCompanyId').value('.', 'int')
from MyXmlTable

【讨论】:

    【解决方案2】:

    node() 代替 ???

    node() 匹配任何类型的所有节点

    【讨论】:

    • 您需要考虑一个比简单的node() 更精确的节点测试。提示:请参阅 Mikael Eriksson 的答案。
    【解决方案3】:

    假设您已将 xml 设置为名为 @x 的变量,那么这就是获取 12 的方法。

    select  x.header.value('.', 'int') 
                    from @x.nodes('//Test/Operations/Operations[last()]/OperationSend/ToCompanyId')
                     as x(header) 
    

    从表的列中获取的查询会略有不同,但 XPATH 是相同的。

    select testxml.query('//Test/Operations/Operations[last()]/OperationSend/ToCompanyId') from dbo.MyXmlTable
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 2016-08-09
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      相关资源
      最近更新 更多