パス式 - 軸の指定
適用対象: 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
軸およびノード名 (ProductDescription
、Features
) をノード テストとして指定しています。 ノード テストの詳細については、「 パス式ステップでのノード テストの指定」を参照してください。
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]
述語が追加されることに注意してください。