上下文函数 - 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>
...