上下文函数 - position (XQuery)

适用于:SQL Server

返回一个整数值,指示上下文项在当前处理的项序列中的位置。

语法

  
fn:position() as xs:integer  

备注

在 SQL Server 中,fn:position () 只能在上下文依赖谓词的上下文中使用。 确切地说,仅可用在方括号 ([ ]) 内。与此函数比较不会在静态类型推导过程中减少基数。

示例

本主题提供针对存储在数据库中各种 xml 类型列中的 XML 实例的 AdventureWorks2022 XQuery 示例。

A. 使用 position() XQuery 函数检索前两个产品功能

以下查询从产品模型目录说明中检索前两个特征,即 元素的前两个子元素 <Features> 。 如果有更多的功能,它会向结果添加元素 <there-is-more/> 。

SELECT CatalogDescription.query('  
     declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     <Product>   
          { /pd:ProductDescription/@ProductModelID }  
          { /pd:ProductDescription/@ProductModelName }   
          {  
            for $f in /pd:ProductDescription/pd:Features/*[position()<=2]  
            return  
            $f   
          }  
          {  
            if (count(/pd:ProductDescription/pd:Features/*) > 2)  
            then <there-is-more/>  
            else ()  
          }   
     </Product>          
') as x  
FROM Production.ProductModel  
WHERE CatalogDescription is not null  

请注意上述查询的以下方面:

  • XQuery Prolog中的命名空间关键字 (keyword) 定义查询正文中使用的命名空间前缀。

  • 查询正文构造 XML,该 XML 具有 <ProductModelID> 和 ProductModelName 属性的 Product 元素,并具有作为子元素返回的产品功能。

  • position () 函数在谓词中使用,以确定 Features> 子元素在上下文中的位置<。 如果是第一个或第二个功能,将返回该子元素。

  • 如果产品目录中具有两个以上的功能,IF 语句会将一个 <there-is-more/> 元素添加到结果中。

  • 由于不是所有产品型号都将其目录说明存储在表中,因此使用 WHERE 子句来放弃 CatalogDescriptions 为 NULL 的行。

这是部分结果:

<Product ProductModelID="19" ProductModelName="Mountain 100">  
  <p1:Warranty xmlns:p1="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <p1:WarrantyPeriod>3 year</p1:WarrantyPeriod>  
    <p1:Description>parts and labor</p1:Description>  
  </p1:Warranty>  
  <p2:Maintenance xmlns:p2="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <p2:NoOfYears>10</p2:NoOfYears>  
    <p2:Description>maintenance contact available through your dealer or  
                    any AdventureWorks retail store.</p2:Description>  
  </p2:Maintenance>  
  <there-is-more/>  
</Product>   
...  

另请参阅

针对 xml 数据类型的 XQuery 函数