パス式 - 軸の指定

適用対象:SQL Server

パス式の軸ステップには、次のコンポーネントが含まれます。

詳細については、「 パス式 (XQuery)」を参照してください。

SQL Server の XQuery 実装では、次の軸ステップがサポートされています。

説明
child コンテキスト ノードの子を返します。
descendant コンテキスト ノードのすべての子孫を返します。
parent コンテキスト ノードの親を返します。
attribute コンテキスト ノードの属性を返します。
自己 コンテキスト ノード自身を返します。
descendant-or-self コンテキスト ノード自身とその子孫をすべて返します。

軸を除くこれらの軸はすべて前方軸です。 軸は逆軸です。これは、ドキュメント階層で後方に検索されるためです。 たとえば、相対パス式 child::ProductDescription/child::Summary には 2 つのステップがあり、各ステップが child 軸を指定します。 最初の手順では、コンテキスト ノードの <ProductDescription> 要素の子を取得します。 ProductDescription> 要素ノードごとに<、2 番目の手順では Summary> 要素ノードの<子を取得します。

相対パス式 には、 child::root/child::Location/attribute::LocationID3 つの手順があります。 最初の 2 つのステップはそれぞれ軸を child 指定し、3 番目のステップは軸を attribute 指定します。 Production.ProductModel テーブルの製造指示 XML ドキュメントに対して実行すると、式はルート>要素の <Location> 要素ノードの子の属性を<返LocationIDします。

このトピックのクエリ例は、AdventureWorks データベースの xml 型の列に対して指定されています。

A. 子軸の指定

特定の製品モデルの場合、次のクエリは、テーブルに<格納されている製品カタログの説明から ProductDescription> 要素ノードの <Features> 要素ノードの子をProduction.ProductModel取得します。

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  /child::PD:ProductDescription/child::PD:Features')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

上のクエリに関して、次の点に注意してください。

  • xml データ型の メソッドはquery()、パス式を指定します。

  • パス式の両方のステップが、child 軸およびノード名 (ProductDescriptionFeatures) をノード テストとして指定しています。 ノード テストの詳細については、「 パス式ステップでのノード テストの指定」を参照してください。

B. descendant 軸と descendant-or-self 軸の指定

次の例では、子孫軸と子孫軸または自己軸を使用します。 この例のクエリは、 xml 型変数に対して指定されています。 XML インスタンスは、生成された結果の違いを簡単に示すために簡略化されています。

declare @x xml  
set @x='  
<a>  
 <b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
 </b>  
</a>'  
declare @y xml  
set @y = @x.query('  
  /child::a/child::b  
')  
select @y  

次の結果では、式から <b> 要素ノードの <a> 子要素ノードが返されます。

<b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
</b>  

この式では、パス式に子孫軸を指定すると、

/child::a/child::b/descendant::*では、要素ノードのすべての子孫を <b> 要求しています。

ノード テストのアスタリスク (*) は、ノード テストとしてのノード名を表します。 したがって、子孫軸のプライマリ ノードの種類である要素ノードによって、返されるノードの種類が決まります。 つまり、式はすべての要素ノードを返します。 テキスト ノードは返されません。 プライマリ ノードの種類とそのノード テストとの関係の詳細については、「 パス式ステップでのノード テストの指定 」トピックを参照してください。

要素ノード <c> と <d> は、次の結果に示すように返されます。

<c>text2  
     <d>text3</d>  
</c>  
<d>text3</d>  

子孫軸ではなく子孫軸または自己軸を指定した場合は、 /child::a/child::b/descendant-or-self::* コンテキスト ノード、要素 <b>、およびその子孫が返されます。

結果を次に示します。

<b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
</b>  
  
<c>text2  
     <d>text3</d>  
</c>  
  
<d>text3</d>   

AdventureWorks データベースに対する次のサンプル クエリでは、 要素の要素子のすべての子孫要素ノード<Features>が<ProductDescription>取得されます。

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  /child::PD:ProductDescription/child::PD:Features/descendant::*  
')  
FROM  Production.ProductModel  
WHERE ProductModelID=19  

C. parent 軸の指定

次のクエリは、テーブルに<Summary>格納されている製品カタログ XML ドキュメントの 要素の子ProductDescription<>要素をProduction.ProductModel返します。

この例では、親軸を使用して要素の<Feature>親に戻り、要素の要素の子を>><Summary<ProductDescription取得します。

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  
/child::PD:ProductDescription/child::PD:Features/parent::PD:ProductDescription/child::PD:Summary  
')  
FROM   Production.ProductModel  
WHERE  ProductModelID=19  
  

このクエリ例では、パス式で parent 軸が使用されています。 次に示すように、この式を parent 軸を使用せずに書き直すこともできます。

/child::PD:ProductDescription[child::PD:Features]/child::PD:Summary  

親軸のより便利な例を次の例に示します。

ProductModel テーブルの CatalogDescription 列に格納されている各製品モデル カタログの説明には<ProductDescription>、次のフラグメントに示すように、 属性と<Features>子要素を持つ ProductModelID 要素があります。

<ProductDescription ProductModelID="..." >  
  ...  
  <Features>  
    <Feature1>...</Feature1>  
    <Feature2>...</Feature2>  
   ...  
</ProductDescription>  

クエリは、 $f要素の子要素を返す反復子変数 を FLWOR ステートメントに <Features> 設定します。 詳細については、「 FLWOR ステートメントとイテレーション (XQuery)」を参照してください。 各機能について、 句は return 次の形式で XML を構築します。

<Feature ProductModelID="...">...</Feature>  
<Feature ProductModelID="...">...</Feature>  

<Feature>要素の をProductModelID追加するには、軸をparent指定します。

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
  for $f in /child::PD:ProductDescription/child::PD:Features/child::*  
  return  
   <Feature  
     ProductModelID="{ ($f/parent::PD:Features/parent::PD:ProductDescription/attribute::ProductModelID)[1]}" >  
          { $f }  
   </Feature>  
')  
FROM  Production.ProductModel  
WHERE ProductModelID=19  

結果の一部を次に示します。

<Feature ProductModelID="19">  
  <wm:Warranty   
   xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>  
    <wm:Description>parts and labor</wm:Description>  
  </wm:Warranty>  
</Feature>  
<Feature ProductModelID="19">  
  <wm:Maintenance   
   xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <wm:NoOfYears>10 years</wm:NoOfYears>  
    <wm:Description>maintenance contract available through your dealer   
                  or any AdventureWorks retail store.</wm:Description>  
  </wm:Maintenance>  
</Feature>  
<Feature ProductModelID="19">  
  <p1:wheel   
   xmlns:p1="https://www.adventure-works.com/schemas/OtherFeatures">  
      High performance wheels.  
  </p1:wheel>  
</Feature>  

単一値が確実に返されるように、パス式の述語 [1] が追加されることに注意してください。