경로 식 - 축 지정

적용 대상: SQL Server

경로 식의 축 단계는 다음 구성 요소를 포함합니다.

자세한 내용은 경로 식(XQuery)을 참조하세요.

SQL Server의 XQuery 구현은 다음 축 단계를 지원합니다.

축 설명
child 컨텍스트 노드의 자식을 반환합니다.
descendant 컨텍스트 노드의 모든 하위 노드를 반환합니다.
parent 컨텍스트 노드의 부모를 반환합니다.
attribute 컨텍스트 노드의 특성을 반환합니다.
self 컨텍스트 노드 자신을 반환합니다.
descendant-or-self 컨텍스트 노드 및 컨텍스트 노드의 모든 하위 항목을 반환합니다.

부모 축을 제외한 이러한 모든 축은 앞으로 축입니다. 부모 축은 문서 계층 구조에서 뒤로 검색되므로 역방향 축입니다. 예를 들어 상대 경로 식 child::ProductDescription/child::Summary 에는 두 단계가 있으며 각 단계는 축을 child 지정합니다. 첫 번째 단계에서는 컨텍스트 노드의 <ProductDescription> 요소 자식을 검색합니다. 각 <ProductDescription> 요소 노드에 대해 두 번째 단계는 Summary> 요소 노드 자식을 검색합니다<.

상대 경로 식 child::root/child::Location/attribute::LocationID에는 세 단계가 있습니다. 처음 두 단계는 각각 child 축을 지정하고 세 번째 단계는 attribute 축을 지정합니다. Production.ProductModel 테이블의 제조 지침 XML 문서에 대해 실행되는 경우 식은 루트> 요소의 <Location> 요소 노드 자식 <특성을 반환 LocationID 합니다.

예제

이 항목의 쿼리 예제는 AdventureWorks 데이터베이스의 xml 형식 열에 대해 지정됩니다.

A. 자식 축 지정

특정 제품 모델의 경우 다음 쿼리<는 테이블에 저장된 Production.ProductModel 제품 카탈로그 설명에서 ProductDescription> 요소 노드의 <Features> 요소 노드 자식을 검색합니다.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  /child::PD:ProductDescription/child::PD:Features')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

이전 쿼리의 다음 사항에 유의하세요:

  • xml 데이터 형식의 메서드는 query() 경로 식을 지정합니다.

  • 경로 식의 단계는 모두 child 축과 노드 이름, ProductDescription과 Features를 노드 테스트로서 지정합니다. 노드 테스트에 대한 자세한 내용은 경로 식 단계에서 노드 테스트 지정을 참조 하세요.

B. descendant 및 descendant-or-self 축 지정

다음 예제에서는 하위 축과 하위 축 또는 자체 축을 사용합니다. 이 예제의 쿼리는 xml 형식 변수에 대해 지정됩니다. 생성되는 결과의 차이점을 쉽게 설명하기 위해 XML 인스턴스를 단순화하였습니다.

declare @x xml  
set @x='  
<a>  
 <b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
 </b>  
</a>'  
declare @y xml  
set @y = @x.query('  
  /child::a/child::b  
')  
select @y  

아래 결과에서 식은 <b> 요소 노드의 <a> 요소 노드 자식을 반환합니다.

<b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
</b>  

이 식에서 경로 식에 대한 하위 축을 지정하는 경우

/child::a/child::b/descendant::*- 요소 노드의 모든 하위 항목을 요청합니다 <b> .

노드 테스트의 별표(*)는 노드 이름을 노드 테스트로 나타냅니다. 따라서 descendant 축의 기본 노드 유형인 요소 노드에 따라 반환되는 노드 유형이 결정됩니다. 즉, 식은 모든 요소 노드를 반환합니다. 텍스트 노드는 반환되지 않습니다. 주 노드 유형 및 노드 테스트와의 관계에 대한 자세한 내용은 경로 식 단계 항목에서 노드 테스트 지정을 참조하세요.

다음 결과와 <>c> <d같이 요소 노드가 반환되고 반환됩니다.

<c>text2  
     <d>text3</d>  
</c>  
<d>text3</d>  

하위 축 대신 하위 축 또는 자체 축을 지정하는 경우 컨텍스트 노드, /child::a/child::b/descendant-or-self::* 요소 <b>및 해당 하위 축을 반환합니다.

다음은 결과입니다.

<b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
</b>  
  
<c>text2  
     <d>text3</d>  
</c>  
  
<d>text3</d>   

AdventureWorks 데이터베이스에 대한 다음 샘플 쿼리는 요소 자식 요소의 모든 하위 요소 노드를ProductDescription<>Features<> 검색합니다.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  /child::PD:ProductDescription/child::PD:Features/descendant::*  
')  
FROM  Production.ProductModel  
WHERE ProductModelID=19  

C. 부모 축 지정

다음 쿼리는 테이블에 저장된 제품 카탈로그 XML 문서에 있는 요소의 <ProductDescription> 요소 자식 요소를 Production.ProductModel 반환 <Summary> 합니다.

다음은 부모 축을 사용하여 요소의 부모로 돌아가 요소의 <<>>FeatureProductDescription자식 요소를 검색하는 <Summary> 예제입니다.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  
/child::PD:ProductDescription/child::PD:Features/parent::PD:ProductDescription/child::PD:Summary  
')  
FROM   Production.ProductModel  
WHERE  ProductModelID=19  
  

이 쿼리 예제에서 경로 식은 축을 parent 사용합니다. 다음과 같이 부모 축 없이 식을 다시 작성할 수 있습니다.

/child::PD:ProductDescription[child::PD:Features]/child::PD:Summary  

다음 예제에서는 부모 축의 더 유용한 예제를 제공합니다.

ProductModel 테이블의 CatalogDescription 열에 저장된 각 제품 모델 카탈로그 설명에는 <ProductDescription> 다음 조각과 같이 특성 및 <Features> 자식 요소가 있는 요소가 ProductModelID 있습니다.

<ProductDescription ProductModelID="..." >  
  ...  
  <Features>  
    <Feature1>...</Feature1>  
    <Feature2>...</Feature2>  
   ...  
</ProductDescription>  

이 쿼리는 FLWOR 문에서 반복기 변수 $f를 설정하여 요소의 <Features> 자식을 반환합니다. 자세한 내용은 FLWOR 문 및 반복(XQuery)을 참조하세요. return 절은 각 기능에 대해 다음 형식으로 XML을 작성합니다.

<Feature ProductModelID="...">...</Feature>  
<Feature ProductModelID="...">...</Feature>  

각 <Feature> 요소에 ProductModelID 대해 추가하려면 축이 parent 지정됩니다.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
  for $f in /child::PD:ProductDescription/child::PD:Features/child::*  
  return  
   <Feature  
     ProductModelID="{ ($f/parent::PD:Features/parent::PD:ProductDescription/attribute::ProductModelID)[1]}" >  
          { $f }  
   </Feature>  
')  
FROM  Production.ProductModel  
WHERE ProductModelID=19  

다음은 결과의 일부입니다.

<Feature ProductModelID="19">  
  <wm:Warranty   
   xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>  
    <wm:Description>parts and labor</wm:Description>  
  </wm:Warranty>  
</Feature>  
<Feature ProductModelID="19">  
  <wm:Maintenance   
   xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <wm:NoOfYears>10 years</wm:NoOfYears>  
    <wm:Description>maintenance contract available through your dealer   
                  or any AdventureWorks retail store.</wm:Description>  
  </wm:Maintenance>  
</Feature>  
<Feature ProductModelID="19">  
  <p1:wheel   
   xmlns:p1="https://www.adventure-works.com/schemas/OtherFeatures">  
      High performance wheels.  
  </p1:wheel>  
</Feature>  

단일 값이 반환되도록 경로 식의 조건 [1] 자가 추가됩니다.