模块和 Prolog - XQuery Prolog

适用范围:SQL Server

XQuery 查询由一个 prolog 和一个主体组成。 XQuery prolog 是一系列声明和定义,它们共同创建所需的查询处理环境。 在 SQL Server 中,XQuery prolog 可以包含命名空间声明。 XQuery 主体由指定预期查询结果的一些表达式组成。

例如,以下 XQuery 针对将制造指令存储为 XML 的 xml 类型的指令列指定。 该查询将检索生产车间 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 prolog 包括命名空间前缀 (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 时,查询 prolog 将指定 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 在查询 prolog 中声明前缀并进行命名空间绑定。

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 声明为元素名称绑定一个默认命名空间。 在这种情况下,并不需要指定任何前缀。

在下面的示例中,查询主体中的路径表达式没有指定命名空间前缀。 默认情况下,所有元素名称都属于 prolog 中指定的默认命名空间。

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   

另请参阅

使用 WITH XMLNAMESPACES 将命名空间添加到查询