シーケンス式 (XQuery)
適用対象:SQL Server
SQL Serverでは、一連の項目の構築、フィルター処理、結合に使用される XQuery 演算子がサポートされています。 項目には、アトミック値またはノードを指定できます。
シーケンスの構築
コンマ演算子を使用して、項目を 1 つのシーケンスに連結するシーケンスを構築できます。
シーケンスには重複する値を含めることができます。 入れ子になったシーケンス (シーケンス内のシーケンス) は折りたたまれます。 たとえば、シーケンス (1, 2, (3, 4, (5))) は (1, 2, 3, 4, 5) になります。 次に、シーケンス構築の例を示します。
例 A
次のクエリは、5 つのアトミック値のシーケンスを返します。
declare @x xml
set @x=''
select @x.query('(1,2,3,4,5)')
go
-- result 1 2 3 4 5
次のクエリは、2 つのノードのシーケンスを返します。
-- 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
次のクエリでは、異なる長さの 4 つのシーケンスを 1 つのシーケンスに組み合わせることにより、アトミック値のシーケンスが構築されます。
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 列に対して指定されます。 この列には、1 つ以上の追加の電話番号、ポケットベル番号、住所などの追加の連絡先情報が格納されます。 telephoneNumber、pager>、およびその他のノードは<、ドキュメント内の任意の場所に表示<できます。> このクエリは、コンテキスト ノードのすべての 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)」を参照してください。 たとえば、次のクエリは、3 つの <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 />
属性 attrA を持つ要素のみを <a
> 取得するには、述語でフィルターを指定できます。 結果のシーケンスに含まれる要素は 1 つだけ <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 演算子を使用したノード シーケンスの結合はサポートされていません。