XQuery での名前空間の処理
適用対象:SQL Server
このトピックでは、クエリで名前空間を処理するためのサンプルを示します。
例
A. 名前空間の宣言
次のクエリでは、特定の製品モデルの製造手順を取得します。
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/AWMI:root/AWMI:Location[1]/AWMI:step
') as x
FROM Production.ProductModel
WHERE ProductModelID=7
結果の一部を次に示します。
<AWMI:step xmlns:AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <AWMI:material>aluminum sheet MS-2341</AWMI:material> into the <AWMI:tool>T-85A framing tool</AWMI:tool>. </AWMI:step>
...
namespace キーワードは、新しい名前空間プレフィックス "AWMI:" を定義するために使用されることに注意してください。 その後、このプレフィックスは、その名前空間のスコープ内にあるすべての要素のクエリで使用する必要があります。
B. 既定の名前空間の宣言
前のクエリでは、新しい名前空間プレフィックスが定義されました。 その後、そのプレフィックスをクエリで使用して、目的の XML 構造を選択する必要がありました。 または、次の変更されたクエリに示すように、名前空間を既定の名前空間として宣言することもできます。
SELECT Instructions.query('
declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/root/Location[1]/step
') as x
FROM Production.ProductModel
where ProductModelID=7
結果
<step xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions">Insert <material>aluminum sheet MS-2341</material> into the <tool>T-85A framing tool</tool>. </step>
...
この例で、定義されている名前空間、"https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
は、既定または空の名前空間をオーバーライドするように作成されています。 このため、クエリに使用されるパス式に名前空間プレフィックスが存在しなくなりました。 また、結果に表示される要素名にも、名前空間プレフィックスはありません。 既定の名前空間は、すべての要素に適用されますが、属性には適用されません。
C. XML 構築時の名前空間の使用
新しい名前空間を定義すると、クエリだけでなく構築のスコープにも含まれます。 たとえば、XML の構築では、"declare namespace ...
" 宣言を使用して新しい名前空間を定義し、その名前空間を、クエリ結果内に表示するために構築した要素と属性と共に使用できます。
SELECT CatalogDescription.query('
declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace myNS="uri:SomeNamespace";<myNS:Result>
{ /ProductDescription/Summary }
</myNS:Result>
') as Result
FROM Production.ProductModel
where ProductModelID=19
結果を次に示します。
<myNS:Result xmlns:myNS="uri:SomeNamespace">
<Summary xmlns="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
<p1:p xmlns:p1="http://www.w3.org/1999/xhtml">
Our top-of-the-line competition mountain bike. Performance-enhancing
options include the innovative HL Frame, super-smooth front
suspension, and traction for all terrain.</p1:p>
</Summary>
</myNS:Result>
代わりに、次のクエリのように、XML 構築の一部として、名前空間を使用する各所で明示的に定義することもできます。
SELECT CatalogDescription.query('
declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<myNS:Result xmlns:myNS="uri:SomeNamespace">
{ /ProductDescription/Summary }
</myNS:Result>
') as Result
FROM Production.ProductModel
where ProductModelID=19
D. 既定の名前空間を使用した構築
構築後の XML で既定の名前空間が使用されるように定義することもできます。 たとえば、次のクエリは、 要素など、構築されるローカル名の要素の既定値として使用する既定の名前空間 "uri:SomeNamespace"\ を指定する方法を <Result>
示しています。
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare default element namespace "uri:SomeNamespace";<Result>
{ /PD:ProductDescription/PD:Summary }
</Result>
') as Result
FROM Production.ProductModel
where ProductModelID=19
結果を次に示します。
<Result xmlns="uri:SomeNamespace">
<PD:Summary xmlns:PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
<p1:p xmlns:p1="http://www.w3.org/1999/xhtml">
Our top-of-the-line competition mountain bike. Performance-
enhancing options include the innovative HL Frame, super-smooth
front suspension, and traction for all terrain.</p1:p>
</PD:Summary>
</Result>
既定の要素名前空間または空の名前空間をオーバーライドすると、構築された XML 内のすべてのローカル名の要素は、その後オーバーライドする既定の名前空間にバインドされることに注意してください。 したがって、空の名前空間を利用して XML を柔軟に構築する必要がある場合は、要素の既定の名前空間をオーバーライドしないようにします。
参照
WITH XMLNAMESPACES を使用したクエリへの名前空間の追加
XML データ (SQL Server)
XQuery 言語リファレンス (SQL Server)