시퀀스 식(XQuery)

적용 대상:SQL Server

SQL Server는 항목 시퀀스를 생성, 필터링 및 결합하는 데 사용되는 XQuery 연산자를 지원합니다. 항목은 원자 값이거나 노드일 수 있습니다.

시퀀스 생성

쉼표 연산자를 사용하여 항목을 단일 시퀀스로 연결하는 시퀀스를 생성할 수 있습니다.

시퀀스에는 중복된 값이 포함될 수 있습니다. 시퀀스 내의 시퀀스인 중첩 시퀀스는 축소됩니다. 예를 들어 시퀀스(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  

다음 쿼리는 두 노드의 시퀀스를 반환합니다.

-- 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개의 시퀀스를 단일 시퀀스로 결합하여 원자성 값 시퀀스를 생성합니다.

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>, <호출기> 및 기타 노드는 문서의 아무 곳에나 나타날 수 있습니다. 쿼리는 컨텍스트 노드의 모든 <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 />  

특성 attrA가 있는 요소만 <a> 검색하려면 조건자에서 필터를 지정할 수 있습니다. 결과 시퀀스에는 하나의 <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 범위 식은 지원되지 않습니다.

  • 시퀀스는 동질적이어야 합니다. 특히 시퀀스의 모든 항목은 노드 또는 원자성 값이어야 합니다. 이 제한은 정적으로 확인됩니다.

  • 공용 구조체, 교차 또는 제외 연산자를 사용하여 노드 시퀀스를 결합하는 것은 지원되지 않습니다.

참고 항목

XQuery 식