序列運算式 (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 運算子來結合節點序列。