position 函數 (XQuery)

傳回整數值,以指出目前所處理的項目序列中內容項目的位置。

語法

fn:position() as xs:integer

備註

在 SQL Server 中,fn:position() 只能用於內容相依述詞的內容中。具體而言,它只能用於括號 ([ ]) 內。針對此函數所做的比較不會在靜態類型推斷期間減少基數。

範例

本主題是針對 XML 執行個體提供 XQuery 範例,這些執行個體是儲存在 AdventureWorks 資料庫的各個 xml 類型資料行中。如需這些資料行中每個資料行的概觀,請參閱<在 AdventureWorks 資料庫中的 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> 元素加上 ProductModelIDProductModelName 屬性的 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> 
…