モジュールとプロローグ - XQuery プロローグ
適用対象:SQL Server
XQuery クエリは、プロローグ (序文) と本文で構成されます。 XQuery プロローグは、クエリ処理に必要な環境を作成する一連の宣言と定義です。 SQL Server では、XQuery プロローグに名前空間の宣言を含めることができます。 XQuery 本文は、目的のクエリ結果を指定する一連の式で構成されます。
たとえば、次の XQuery は、製造指示を XML として格納する xml 型の Instructions 列に対して指定されます。 このクエリでは、ワーク センターの場所 10
に関する製造手順が取得されます。 query()
xml データ型の メソッドを使用して、XQuery を指定します。
SELECT Instructions.query('declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/AWMI:root/AWMI:Location[@LocationID=10]
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
上のクエリに関して、次の点に注意してください。
XQuery プロローグには、名前空間プレフィックス (AWMI) 宣言 が
(namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
含まれています。declare namespace
キーワードは、クエリ本文で後から使用される名前空間プレフィックスを定義します。/AWMI:root/AWMI:Location[@LocationID="10"]
がクエリの本文です。
名前空間の宣言
次のクエリで示すように、名前空間の宣言でプレフィックスを定義し、名前空間 URI に関連付けます。 クエリでは、 CatalogDescription
は xml 型の列です。
この列に対する XQuery の指定では、クエリのプロローグで declare namespace
宣言を指定して、製品説明のプレフィックス PD
を名前空間 URI に関連付けています。 このプレフィックスは、名前空間 URI ではなくクエリ本文で使用されます。 結果の XML 内のノードは、名前空間 URI に関連付けられている名前空間にあります。
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
where ProductModelID=19
クエリの読みやすさを向上させるには、 を使用してクエリ プロローグでプレフィックスと名前空間のバインドを宣言する代わりに、WITH XMLNAMESPACES を使用して名前空間を declare namespace
宣言できます。
WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD)
SELECT CatalogDescription.query('
/PD:ProductDescription/PD:Summary
') as Result
FROM Production.ProductModel
where ProductModelID=19
詳細については、「 WITH XMLNAMESPACES を使用してクエリに名前空間を追加する」を参照してください。
既定の名前空間宣言
宣言を使用 declare namespace
して名前空間プレフィックスを宣言する代わりに、 宣言を declare default element namespace
使用して、要素名の既定の名前空間をバインドできます。 この場合、プレフィックスは指定しません。
次の例では、クエリ本文のパス式で名前空間プレフィックスが指定されていません。 既定では、すべての要素名は、プロローグで指定された既定の名前空間に属します。
SELECT CatalogDescription.query('
declare default element namespace "https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
/ProductDescription/Summary
') as Result
FROM Production.ProductModel
WHERE ProductModelID=19
WITH XMLNAMESPACES を使用して、既定の名前空間を宣言できます。
WITH XMLNAMESPACES (DEFAULT 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription')
SELECT CatalogDescription.query('
/ProductDescription/Summary
') as Result
FROM Production.ProductModel
WHERE ProductModelID=19