시퀀스 및 QNames(XQuery)
적용 대상:SQL Server
이 항목에서는 XQuery의 다음과 같은 기본 개념에 대해 설명합니다.
순서
QName 및 미리 정의된 네임스페이스
순서
XQuery에서 식의 결과는 XSD 원자성 형식의 XML 노드 및 인스턴스 목록으로 구성된 시퀀스입니다. 시퀀스의 개별 항목을 항목이라고 합니다. 시퀀스의 항목은 다음 중 하나일 수 있습니다.
요소, 특성, 텍스트, 처리 명령, 주석 또는 문서와 같은 노드
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
QNames입니다.
다음 예제에서는 형식 화된 xml 열에 대해 쿼리를 지정합니다. 쿼리는 첫 번째 작업 센터 위치의 모든 <단계> 요소를 반복합니다.
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
QNames입니다.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 스키마 컬렉션에서 액세스할 수 있도록 이러한 스키마를 예약합니다.
참고 항목
이 구현에서는 XQuery 사양http://www.w3.org/2004/07/xquery-local-functions에 local
설명된 대로 접두사를 지원하지 않습니다.