パス式 - 軸の指定
適用対象: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::LocationID
3 つの手順があります。 最初の 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
軸およびノード名 (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 データベースに対する次のサンプル クエリでは、 要素の要素子のすべての子孫要素ノード<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]
が追加されることに注意してください。