경로 식 - 축 지정
적용 대상: 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
> 합니다.
다음은 부모 축을 사용하여 요소의 부모로 돌아가 요소의 <<>>Feature
ProductDescription
자식 요소를 검색하는 <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]
자가 추가됩니다.