2011-05-14 30 views
1

在SQL Server中的XML列我有這樣的XML:如何在沒有名稱的情況下在sql查詢中獲取xmlelement的子項?

<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 
+0

我建議您接受最好的答案 - 在這種特殊情況下它是由@Mikael埃裏克森給出。 – 2011-05-15 18:12:50

回答

1

節點()代替???

節點()比賽

+0

您需要考慮一個比「node()」更精確的節點測試。提示:請參閱Mikael Eriksson的答案。 – 2011-05-15 18:11:17

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 
3

你可以使用任何形式的所有節點*

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

+1爲最佳答案。 – 2011-05-15 18:09:58

相關問題