query() メソッド (xml データ型)
xml データ型のインスタンスに対する XQuery を指定します。結果は、xml 型の値になります。このメソッドでは、型指定されていない XML のインスタンスを返します。
構文
query ('XQuery')
引数
- XQuery
XML インスタンス内の XML ノード (要素や属性など) をクエリする XQuery 式の文字列です。
例
このセクションでは、xml データ型の query() メソッドの使用例について説明します。
A. xml 型変数に対する query() メソッドの使用
次の例では、xml 型の変数 @myDoc を宣言し、XML インスタンスをこれに代入します。その後 query() メソッドを使用して、ドキュメントに対して XQuery を指定します。
次のクエリは、<ProductDescription
> 要素の <Features
> 子要素を取得します。
declare @myDoc xml
set @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
<Warranty>1 year parts and labor</Warranty>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>'
SELECT @myDoc.query('/Root/ProductDescription/Features')
結果を次に示します。
<Features>
<Warranty>1 year parts and labor</Warranty>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
B. xml 型列に対する query() メソッドの使用
次の例では、query() メソッドを使用して、AdventureWorks データベースの xml 型の列 CatalogDescription に対して XQuery を指定します。
SELECT CatalogDescription.query('
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('
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";
/PD:ProductDescription/PD:Features/wm:Warranty ') = 1
上のクエリに関して、次の点に注意してください。
- CatalogDescription 列は、型指定された xml 列です。つまり、これには関連付けられたスキーマ コレクションがあります。 XQuery プロローグ では、namespace キーワードを使って、後でクエリ本文で使用するプレフィックスを定義しています。
- query() メソッドは XML を構築します。<
Product
> 要素には ProductModelID 属性が指定されます。また、ProductModelID 属性値はデータベースから取得されます。XML 構築の詳細については、「XML の構築 (XQuery)」を参照してください。 - WHERE 句の exist() メソッド (XML データ型) は、XML 内で <
Warranty
> 要素を含む行だけを検索することに使用されています。namespace キーワードを使用して名前空間プレフィックスが定義されています。
結果の一部を次に示します。
<Product ProductModelID="19"/>
<Product ProductModelID="23"/>
...
query() メソッドと exist() メソッドはどちらも PD プレフィックスを宣言していることに注意してください。このような場合は、WITH XMLNAMESPACES を最初に使用して、プレフィックス定義し、これをクエリで使用することもできます。
WITH XMLNAMESPACES (
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,
'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain' AS wm)
SELECT CatalogDescription.query('
<Product ProductModelID="{ /PD:ProductDescription[1]/@ProductModelID }" />
') as Result
FROM Production.ProductModel
where CatalogDescription.exist('
/PD:ProductDescription/PD:Features/wm:Warranty ') = 1
参照
概念
WITH XMLNAMESPACES を使用した名前空間の追加
型指定された XML と型指定されていない XML
xml データ型
XML インスタンスの生成
XML DML (XML データ変更言語)
サンプル XML アプリケーション