Как получить дочерний элемент xmlelement в запросе sql без его имени? - PullRequest
1 голос
/ 14 мая 2011

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

Мне нужно взять ToCompanyId из последней операции (12). Я пришел к чему-то вроде этого. Что должно быть в ??? когда может быть любой тип операции с ToCompanyId.

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

Ответы [ 3 ]

3 голосов
/ 15 мая 2011

Вы можете использовать *

select testxml.query('(/Test/Operations/Operations)[last()]/*/ToCompanyId').value('.', 'int')
from MyXmlTable
1 голос
/ 15 мая 2011

Поместить node () вместо ???

node () соответствует всем узлам любого вида

1 голос
/ 14 мая 2011

Предполагая, что вы установили в 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
...