2009-12-11 12 views
20

これは私の問題です:列内の次のXMLから、名前が 'Enabled'の変数の値がステップIDの「Yes」に等しいかどうかを知りたいコンポーネントIDとを含む。SQL XML値を取得するためのXPath

'<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内の特定のノードを検索する手続きファッションよりも、セット指向のファッションでは、結果の関係に参加します。あなたが興味の正確値を取得するXPathを使用する必要がある場合は、しかし、

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) 

:stepID場合

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) 

とここで関心のノードおよび属性をズタズタシンプルなXMLクエリですコンポーネントIDは変数ではなく列であるため、XPathフィルタではsql:variableの代わりにsql:column()を使用する必要があります。 Binding Relational Data Inside XML Dataを参照してください。

そしてfinaly、あなたが必要とするすべてはあなたがexist() XMLメソッドを使用することができますexistanceをチェックする場合:SQL Server 2005の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」とは何ですか? * –

+3

DECLARE @x XML =(質問からのXML); がSQL Serverのクエリウィンドウ内の彼のステートメントの上にあると思われます。それは重複していたので答えます。言い換えれば、それは質問からのXMLを含む変数であると思われます。 – sirdank

2

私はあなたが欲しいXPathクエリは、このようなものになると思う:これはあなたの指定した$ stepIdと$ COMPONENTIDための「はい」の値が「有効」と命名された変数を取得する必要があります

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

を。これはあなたのXMLがあなたのようなタグで始まると仮定しています。

SQL Server 2005のXPathはかなり簡単です(私はそれを使ったことはありません)。そうしないと、他の人があなたを助けなければならないかもしれません。

+0

ありがとうございました。一致するものが見つかった場合、真偽を返すにはどうすればよいですか?または、0または1を返します。 – joerage

+0

わかりません。 IFカウント()> = 1 SELECT 1 ELSE SELECT 0 –

+0

EXISTメソッドを使用することができます。 Field.EXIST( 'xpath') –

関連する問題