시퀀스 식(XQuery)
적용 대상: SQL Server
SQL Server는 항목 시퀀스를 생성, 필터링 및 결합하는 데 사용되는 XQuery 연산자를 지원합니다. 항목은 원자 값이거나 노드일 수 있습니다.
시퀀스 생성
쉼표 연산자를 사용하여 항목을 단일 시퀀스로 연결하는 시퀀스를 생성할 수 있습니다.
시퀀스에는 중복된 값이 포함될 수 있습니다. 시퀀스 내의 시퀀스인 중첩 시퀀스는 축소됩니다. 예를 들어 시퀀스(1, 2, (3, 4, (5))는 (1, 2, 3, 4, 5)가 됩니다. 다음은 시퀀스를 생성하는 예제입니다.
예 1
다음 쿼리는 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
예 2
다음 쿼리는 서로 다른 길이의 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
예 3
다음 쿼리는 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 범위 식은 지원되지 않습니다.
시퀀스는 동질적이어야 합니다. 특히 시퀀스의 모든 항목은 노드 또는 원자성 값이어야 합니다. 이 제한은 정적으로 확인됩니다.
공용 구조체, 교차 또는 제외 연산자를 사용하여 노드 시퀀스를 결합하는 것은 지원되지 않습니다.