시퀀스 및 QName(XQuery)

이 항목에서는 XQuery의 다음 기본 개념에 대해 설명합니다.

  • 시퀀스

  • QName 및 미리 정의된 네임스페이스

시퀀스

XQuery에서 식 결과는 XML 노드 목록 및 XSD 원자 유형의 인스턴스로 구성된 시퀀스입니다. 시퀀스의 개별 항목은 항목으로 참조됩니다. 시퀀스의 항목은 다음 중 하나일 수 있습니다.

  • 요소, 특성, 텍스트, 처리 명령, 주석 또는 문서와 같은 노드

  • XSD 예제 유형의 인스턴스와 같은 원자 값

예를 들어 다음 쿼리는 두 개의 요소 노드 항목의 시퀀스를 생성합니다.

SELECT Instructions.query('
     <step1> Step 1 description goes here</step1>,
     <step2> Step 2 description goes here </step2>
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7;

다음은 결과입니다.

<step1> Step 1 description goes here </step1>
<step2> Step 2 description goes here </step2> 

이전 쿼리에서 <step1> 구조의 끝에 있는 쉼표(,)는 시퀀스 생성자이며 필수 요소입니다. 결과에 있는 공백은 설명용으로만 추가된 것이며 이 설명서의 모든 결과 예에 포함되어 있습니다.

다음은 시퀀스에 대해 알아야 하는 추가 정보입니다.

  • 시퀀스 내의 쿼리 결과에 다른 시퀀스가 포함된 경우 포함된 시퀀스는 컨테이너 시퀀스에 결합됩니다. 예를 들어 시퀀스 ((1,2, (3,4,5)),6)은 데이터 모델에 (1, 2, 3, 4, 5, 6)으로 결합됩니다.

    DECLARE @x xml;
    SET @x = '';
    SELECT @x.query('(1,2, (3,4,5)),6');
    
  • 빈 시퀀스는 항목이 포함되지 않은 시퀀스입니다. 이러한 시퀀스는 "()"로 표시됩니다.

  • 항목이 하나만 있는 시퀀스는 원자 값으로 취급되며 그 반대도 마찬가지입니다. 즉, (1) = 1입니다.

이 구현에서 시퀀스는 유형이 같아야 합니다. 즉, 원자 값의 시퀀스나 노드 시퀀스가 포함됩니다. 예를 들어 다음은 유효한 시퀀스입니다.

DECLARE @x xml;
SET @x = '';
-- Expression returns a sequence of 1 text node (singleton).
SELECT @x.query('1');
-- Expression returns a sequence of 2 text nodes
SELECT @x.query('"abc", "xyz"');
-- Expression returns a sequence of one atomic value. data() returns
-- typed value of the node.
SELECT @x.query('data(1)');
-- Expression returns a sequence of one element node. 
-- In the expression XML construction is used to construct an element.
SELECT @x.query('<x> {1+2} </x>');

다음 쿼리에서는 유형이 다른 시퀀스가 지원되지 않기 때문에 오류를 반환합니다.

SELECT @x.query('<x>11</x>, 22');

QName

XQuery의 모든 식별자는 QName입니다. QName은 네임스페이스 접두사 및 로컬 이름으로 구성됩니다. 이 구현에서 XQuery에 있는 변수 이름은 QName이며 접두사가 포함될 수 없습니다.

다음 예에서는 형식화되지 않은 xml 변수에 대해 쿼리가 지정되어 있습니다.

DECLARE @x xml;
SET @x = '<Root><a>111</a></Root>';
SELECT @x.query('/Root/a');

식(/Root/a)에서 Root 및 a는 QName입니다.

다음 예에서는 형식화된 xml 열에 대해 쿼리가 지정됩니다. 이 쿼리는 첫 번째 작업 센터 위치에 있는 모든 <step> 요소에 대해 반복됩니다.

SELECT Instructions.query('
   declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
for $Step in /AWMI:root/AWMI:Location[1]/AWMI:step
      return
           string($Step) 
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7;

쿼리 식에서 다음에 유의하십시오.

  • AWMI root, AWMI:Location, AWMI:step 및 $Step은 모두 QName입니다. AWMI는 접두사이고 root, Location 및 Step은 모두 로컬 이름입니다.

  • $step 변수는 QName이며 접두사가 없습니다.

다음 네임스페이스는 SQL Server에서 지원되는 XQuery에서 사용하도록 미리 정의되어 있습니다. 

접두사

URI

xs

http://www.w3.org/2001/XMLSchema

xsi

http://www.w3.org/2001/XMLSchema-instance

xdt

http://www.w3.org/2004/07/xpath-datatypes

fn

http://www.w3.org/2004/07/xpath-functions

(접두사 없음)

urn:schemas-microsoft-com:xml-sql

sqltypes

https://schemas.microsoft.com/sqlserver/2004/sqltypes

xml

http://www.w3.org/XML/1998/namespace

(접두사 없음)

https://schemas.microsoft.com/sqlserver/2004/SOAP

만드는 모든 데이터베이스에는 sys XML 스키마 컬렉션이 있습니다. 이 컬렉션은 사용자가 만든 XML 스키마 컬렉션에서 액세스할 수 있도록 이러한 스키마를 준비해 둡니다.

[!참고]

이 구현에서는 http://www.w3.org/2004/07/xquery-local-functions에 있는 XQuery 사양에서 설명된 것과 같이 local 접두사가 지원되지 않습니다.

참고 항목

관련 자료

XQuery 기초