次の方法で共有


シーケンス式 (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> 子を含むシーケンスを作成し、その後に <pager> 子を作成します。 戻り値の式でコンマ シーケンス演算子を使用 ($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>  

シーケンスのフィルター処理

式に述語を追加することで、式によって返されるシーケンスをフィルター処理できます。 詳細については、「 Path 式 (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> 要素のみを取得するには、述語でフィルターを指定できます。 結果のシーケンスには、 <a> 要素が 1 つだけ含まれます。

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>を検索し、要素<c>を含む<b>を検索します。

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 式