共用方式為


序列表示式 (XQuery)

適用於:SQL Server

SQL Server 支援用來建構、篩選和結合專案序列的 XQuery 運算符。 專案可以是不可部分完成的值或節點。

建構序列

您可以使用逗號運算符來建構將專案串連成單一序列的序列。

序列可以包含重複的值。 巢狀序列,序列內的序列會折疊。 例如,序列(1、2、(3、4、5))會變成(1、2、3、4、5)。 這些是建構序列的範例。

範例 A

下列查詢會傳回五個不可部分完成值的序列:

declare @x xml  
set @x=''  
select @x.query('(1,2,3,4,5)')  
go  
-- result 1 2 3 4 5  

下列查詢會傳回兩個節點的序列:

-- sequence of 2 nodes  
declare @x xml  
set @x=''  
select @x.query('(<a/>, <b/>)')  
go  
-- result  
<a />  
<b />  

下列查詢會傳回錯誤,因為您正在建構一連串不可部分完成的值和節點。 這是異質序列,不支援。

declare @x xml  
set @x=''  
select @x.query('(1, 2, <a/>, <b/>)')  
go  

範例 B

下列查詢會將四個不同長度序列結合成單一序列,以建構不可部分完成值序列。

declare @x xml  
set @x=''  
select @x.query('(1,2),10,(),(4, 5, 6)')  
go  
-- result = 1 2 10 4 5 6  

您可以使用 FLOWR 和 ORDER BY 來排序序列:

declare @x xml  
set @x=''  
select @x.query('for $i in ((1,2),10,(),(4, 5, 6))  
                  order by $i  
                  return $i')  
go  

您可以使用 fn:count() 函式來計算序列中的專案。

declare @x xml  
set @x=''  
select @x.query('count( (1,2,3,(),4) )')  
go  
-- result = 4  

範例 C

下列查詢是針對 Contact 資料表中 xml 類型的 AdditionalContactInfo 資料行所指定。 此數據行會儲存其他連絡資訊,例如一或多個其他電話號碼、呼叫器號碼和位址。 <電話編號>、<呼叫器>和其他節點可以出現在檔中的任何位置。 查詢會建構一個序列,其中包含內容節點的所有 <telephoneNumber> 子系,後面接著 <呼叫器> 子系。 請注意,在傳回表示式中使用逗號序列運算子 ($a//act:telephoneNumber, $a//act:pager)

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes' AS act,  
 'https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo' AS aci)  
  
SELECT AdditionalContactInfo.query('  
   for $a in /aci:AdditionalContactInfo   
   return ($a//act:telephoneNumber, $a//act:pager)  
') As Result  
FROM Person.Contact  
WHERE ContactID=3  

以下是結果:

<act:telephoneNumber xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  <act:number>333-333-3333</act:number>  
</act:telephoneNumber>  
<act:telephoneNumber xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  <act:number>333-333-3334</act:number>  
</act:telephoneNumber>  
<act:pager xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">  
  <act:number>999-555-1244</act:number>  
  <act:SpecialInstructions>  
Page only in case of emergencies.  
</act:SpecialInstructions>  
</act:pager>  

篩選序列

您可以將述詞新增至表達式,以篩選表示式所傳回的序列。 如需詳細資訊,請參閱 路徑表示式 (XQuery) 。 例如,下列查詢會傳回三 <a> 個元素節點的序列:

declare @x xml  
set @x = '<root>  
<a attrA="1">111</a>  
<a></a>  
<a></a>  
</root>'  
SELECT @x.query('/root/a')  

以下是結果:

<a attrA="1">111</a>  
<a />  
<a />  

若要只 <a> 擷取具有 attrA 屬性的專案,您可以在述詞中指定篩選條件。 產生的序列只會有一個專案 <a> 。

declare @x xml  
set @x = '<root>  
<a attrA="1">111</a>  
<a></a>  
<a></a>  
</root>'  
SELECT @x.query('/root/a[@attrA]')  

以下是結果:

<a attrA="1">111</a>  

如需如何在路徑表示式中指定述詞的詳細資訊,請參閱 在路徑表示式步驟中指定述詞。

下列範例會建置子樹的序列表達式,然後將篩選套用至序列。

declare @x xml  
set @x = '  
<a>  
  <c>C under a</c>  
</a>  
<b>    
   <c>C under b</c>  
</b>  
<c>top level c</c>  
<d></d>  
'  

中的 (/a, /b) 運算式會使用子樹 /a 建構序列,以及 /b 從產生的序列,表達式篩選元素 <c>

SELECT @x.query('  
  (/a, /b)/c  
')  

以下是結果:

<c>C under a</c>  
<c>C under b</c>  

下列範例會套用述詞篩選條件。 表示式會尋找元素<a>,且<b>包含 專案 。<c>

declare @x xml  
set @x = '  
<a>  
  <c>C under a</c>  
</a>  
<b>    
   <c>C under b</c>  
</b>  
  
<c>top level c</c>  
<d></d>  
'  
SELECT @x.query('  
  (/a, /b)[c]  
')  

以下是結果:

<a>  
  <c>C under a</c>  
</a>  
<b>  
  <c>C under b</c>  
</b>  

實作限制

以下是限制:

  • 不支援 XQuery 範圍表達式。

  • 序列必須是同質的。 具體而言,序列中的所有專案都必須是節點或不可部分完成的值。 這是靜態檢查。

  • 不支援使用等位、交集或 except 運算符來結合節點序列。

另請參閱

XQuery 表達式