1

在 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
4

3 回答 3

3

您可以使用*

select testxml.query('(/Test/Operations/Operations)[last()]/*/ToCompanyId').value('.', 'int')
from MyXmlTable
于 2011-05-14T20:46:50.130 回答
1

假设您已将 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
于 2011-05-14T19:41:13.260 回答
1

node()而不是 ???

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

于 2011-05-14T20:44:13.947 回答