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 关键字定义查询主体中使用的命名空间前缀。
查询主体构造具有带 ProductModelID 和 ProductModelName 属性的 <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>
…