web-dev-qa-db-ja.com

SQL XML値を取得するXPath

ここに私の問題があります。列内にある次のXMLから、ステップIDとコンポーネントIDが与えられた場合、「Enabled」という名前の変数の値が「Yes」に等しいかどうかを知りたいです。

'<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>'
22
joerage

更新

私の推奨事項は、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:variableの代わりにsql:column()を使用する必要があります。 XMLデータ内のリレーショナルデータのバインド を参照してください。

最後に、存在を確認するだけであれば、 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"]') 
36
Remus Rusanu

SQL Server 2005でXML機能を使用する方法を知るために、私はいつもこの記事 SQL Server 2005 XQueryおよびXML-DML-パート1 に戻ります。

XPathの基本的なノウハウについては、 W3Schoolsチュートリアル をお勧めします。

2
marc_s

あなたが望むxpathクエリは次のようなものになると思います:

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

これにより、指定された$ stepIdおよび$ componentIdの値が「Yes」である「Enabled」という名前の変数が取得されます。これは、xmlが表示するようなタグで始まり、

SQL Server 2005 XPathの内容が非常に単純な場合(使用したことがない)、上記のクエリは機能します。それ以外の場合は、他の誰かがそれを支援する必要があります。

2
Mike Cialowicz