Xpath 如何在sql查询中获取xmlelement的子级而不使用其名称?

Xpath 如何在sql查询中获取xmlelement的子级而不使用其名称?,xpath,xquery-sql,Xpath,Xquery Sql,在sql server xml列中,我有如下xml: <Test> <Operations> <Operations type="OperationSend"> <OperationSend> <ToCompanyId>1</ToCompanyId> &

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

假设您已经将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

假设您已经将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
节点()替换为

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

Putnode()而不是


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

您可以使用
*

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

您可以使用
*

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

您需要考虑一种更精确的节点测试,而不仅仅是
node()
。提示:请参阅Mikael Eriksson的答案。您需要考虑一个更精确的节点测试,而不仅仅是
node()
。提示:请参阅Mikael Eriksson的答案。我建议您接受最好的答案——在本例中是由@Mikael Eriksson给出的。我建议您接受最好的答案——在本例中是由@Mikael Eriksson给出的。