次の方法で共有


シーケンス式 (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 演算子を使用したノード シーケンスの結合はサポートされていません。

参照

XQuery 式