次の方法で共有


パス式 - 軸の指定

適用対象: SQL Server

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

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

SQL Server の XQuery 実装では、次の軸の手順がサポートされています。

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

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

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

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

A. 子軸の指定

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

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 データベースに対する次のサンプル クエリでは、<ProductDescription>要素の<Features>要素の子のすべての子孫要素ノードを取得します。

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 軸の指定

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

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

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

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

このクエリでは、FLWOR ステートメントで反復子変数 $fを設定し、 <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] 述語が追加されることに注意してください。