次の方法で共有


query() メソッド (xml データ型)

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance

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 データ変更言語 (XML DML)