Context Functions - position (XQuery)
適用於:SQL Server
傳回整數值,指出內容專案在目前正在處理的專案序列中的位置。
語法
fn:position() as xs:integer
備註
在 SQL Server 中, fn:position() 只能在內容相依述詞的內容中使用。 具體來說,它只能在括弧 ([ ]) 內使用。與這個函式比較並不會減少靜態類型推斷期間的基數。
範例
本主題針對儲存在資料庫中各種 xml 類型數據行中的 AdventureWorks2022
XML 實例,提供 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 中的 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 AdventureWorks retail store.</p2:Description>
</p2:Maintenance>
<there-is-more/>
</Product>
...