2009-12-11 112 views
20

這是我的問題:從列中的以下XML中,我想知道名爲「已啓用」的變量的值是否等於'是'給定的步驟標識和一個組件Id。XPath來獲取SQL XML值

'<xml> 
    <box stepId="1"> 
    <components> 
     <component id="2"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV1" /> 
      <variable id="4" nom="Enabled" valeur="Yes" /> 
     </variables> 
     </component> 
     <component id="3"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV1" /> 
      <variable id="4" nom="Enabled" valeur="No" /> 
     </variables> 
     </component> 
    </components> 
    </box> 
    <box stepId="2"> 
    <components> 
     <component id="2"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV2" /> 
      <variable id="4" nom="Enabled" valeur="Yes" /> 
     </variables> 
     </component> 
     <component id="3"> 
     <variables> 
      <variable id="3" nom="Server" valeur="DEV2" /> 
      <variable id="4" nom="Enabled" valeur="No" /> 
     </variables> 
     </component> 
    </components> 
    </box> 
</xml>' 

回答

31

更新

我recomendation將XML分解到關係並做搜索和連接上產生關係,在一組時尚化,而不是在XML搜索特定節點的程序時尚。下面是切碎了的節點和感興趣的屬性一個簡單的XML查詢:

select x.value(N'../../../../@stepId', N'int') as StepID 
    , x.value(N'../../@id', N'int') as ComponentID 
    , x.value(N'@nom',N'nvarchar(100)') as Nom 
    , x.value(N'@valeur', N'nvarchar(100)') as Valeur 
from @x.nodes(N'/xml/box/components/component/variables/variable') t(x) 

但是,如果必須使用獲取的利益完全值的XPath:

select x.value(N'@valeur', N'nvarchar(100)') as Valeur 
from @x.nodes(N'/xml/box[@stepId=sql:variable("@stepID")]/ 
    components/component[@id = sql:variable("@componentID")]/ 
     variables/variable[@nom="Enabled"]') t(x) 

如果stepID和組件ID是列而不是變量,您應該在XPath過濾器中使用sql:column()而不是sql:variable。見Binding Relational Data Inside XML Data

而且finaly如果你需要的是檢查所有腦幹你可以使用exist() XML方法:

select @x.exist(
    N'/xml/box[@stepId=sql:variable("@stepID")]/ 
    components/component[@id = sql:variable("@componentID")]/ 
     variables/variable[@nom="Enabled" and @valeur="Yes"]') 
+4

什麼是@ x'? *(填充評論到15個字符)* – 2013-02-05 16:39:39

+3

我懷疑他有 'DECLARE @x XML =(xml from question);' 上面他的SQL Server查詢窗口中的語句,以便使用該XML進行測試,但是將其從他的回答是因爲它會是多餘的。所有這一切說,我懷疑它是一個包含問題的XML的變量。 – sirdank 2014-02-25 14:53:39

2

我想你想的XPath查詢是這樣的:

/xml/box[@stepId="$stepId"]/components/component[@id="$componentId"]/variables/variable[@nom="Enabled" and @valeur="Yes"] 

這應該讓你被命名爲「已啓用」與「是」的值指定的$ stepId和$ COMPONENTID變量。這假設你的xml以像你展示的標籤開頭,而不是

如果SQL Server 2005 XPath的東西非常簡單(我從來沒有使用它),那麼上述查詢應該可以工作。否則,其他人可能需要幫助你。

+0

謝謝,這有幫助。如果找到了匹配,我該如何返回true或false?或者返回0或1. – joerage 2009-12-11 22:04:48

+0

我不確定。您可以嘗試如下所示: IF count(<您的xpath查詢>)> = 1 SELECT 1 ELSE SELECT 0 – 2009-12-14 00:52:19

+0

您可以使用EXIST方法。 Field.EXIST( '的xpath') – 2013-09-23 14:48:54