query() 方法(xml 数据类型)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例

对 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 Prolog 中,namespace 关键字定义稍后用于查询主体的前缀。

  • query() 方法构造 XML,即包含 ProductModelID 属性的 <Product> 元素,其中 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)