query()方法(xml Data Type)

本主题适用于: SQL Server (starting with 2008) Azure SQL Database Azure SQL Data Warehouse  Parallel Data Warehouse

针对一个xml 数据类型的实例,指定一个XQuery。结果是xml类型。该方法返回一个非类型化的XML实例。

句法

query ('XQuery')

参数

XQuery
是一个字符串、一个XQuery表达式,在一个XML实例中,查询XML节点,比如说元素、属性。

示例

这部分提供了使用data数据类型的query()方法的实例。

A. 针对一个xml类型变量使用query()方法

下面的示例先声明了一个xml类型的变量@myDoc,并把一个XML实例指派给它。然后使用query()方法,以针对该文档指定一个XQuery。

查询取得了<ProductDescriotion>l元素的子元素<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()方法以针对CatalogDescription列指定一个XQuery,该列在AdventureWorks数据库中,是xml类型。

SELECT CatalogDescription.query('
declare namespace PD="http://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="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";
     /PD:ProductDescription/PD:Features/wm:Warranty ') = 1

从前面的查询中注意以下几点:

  • CatalogDescription列是一个类型化的xml列。这意味着它有一个架构集合和它关联。在XQuery Prolog中,用了namespace关键词用来定义前缀,不久将用在查询体上。
  • query()方法构造了XML,一个<Product>元素,具有一个ProductModelID属性,其中ProductModelID属性值接收自数据库。欲进一步了解XML构造,请参阅XML构造(XQuery)
  • WHERE子句中的exist()方法(XML data type)用来查找XML中包含了<Warranty>元素的行。再次强调,namespace关键词用来定义两个命名空间前缀。

下面是结果的一部分:

<Product ProductModelID="19"/>
<Product ProductModelID="23"/>
...

注意query()方法和exists()方法都声明了PD前缀。在这种情况下,你可以使用WITH XMLNAMESPACES以先行定义前缀,然后在查询中使用它。

WITH XMLNAMESPACES (
   'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD,
   'http://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

如果你喜欢这篇文章,敬请给站长打赏↑

除特别注明外,本站所有文章均为本站站长原译,转载请注明出处。