position 函数 (XQuery)

返回一个指明当前正被处理的项的序列中上下文项的位置的整数值。

语法

fn:position() as xs:integer

注释

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

示例

本主题提供了一些对 XML 实例的 XQuery 示例,这些实例存储在 AdventureWorks2008R2 数据库内不同的 xml 类型列中。有关这些列的概述,请参阅AdventureWorks2008R2 数据库中的 xml 数据类型表示形式

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 中的 namespace 关键字定义查询主体中使用的命名空间前缀。

  • 查询主体构造具有带 ProductModelIDProductModelName 属性的 <Product> 元素和作为子元素返回的产品功能的 XML。

  • 用于谓词的 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 Adventure Works retail store.</p2:Description>

</p2:Maintenance>

<there-is-more/>

</Product>