다음을 통해 공유


경로 식 - 축 지정

적용 대상: 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 축과 노드 이름, ProductDescriptionFeatures를 노드 테스트로서 지정합니다. 노드 테스트에 대한 자세한 내용은 경로 식 단계에서 노드 테스트 지정을 참조 하세요.

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] 자가 추가됩니다.