position 函數 (XQuery)
傳回整數值,以指出目前所處理的項目序列中內容項目的位置。
語法
fn:position() as xs:integer
備註
在 SQL Server 中,fn:position() 只能用於內容相依述詞的內容中。 具體而言,它只能用於括號 ([ ]) 內。針對此函數所做的比較不會在靜態類型推斷期間減少基數。
範例
本主題針對 XML 執行個體提供 XQuery 範例,這些執行個體是儲存在 AdventureWorks2012 資料庫的各種 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 初構中的 namespace 關鍵字定義了可用於查詢主體中的命名空間前置詞。
查詢主體將建構含有 <Product> 元素加上 ProductModelID 與 ProductModelName 屬性的 XML,以及含有以子元素傳回的產品功能。
position() 函數可用於述詞中以判斷內容中 <Features> 子元素的位置。 如果它是第一個或第二個功能,就會傳回它。
如果在產品目錄中有兩個以上的功能,IF 陳述式會將 <there-is-more/> 元素加入結果中。
因為並非所有的產品型號都在資料表中儲存目錄描述,所以將使用 WHERE 子句來捨棄 CatalogDescriptions 為 NULL 的 WHERE 子句。
以下是部份結果:
<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>
…