일반 XQuery 사용 사례

이 항목에서는 XQuery에 대한 일반적인 사용 예를 보여 줍니다.

1.제품 및 중량 검색을 위한 카탈로그 설명 쿼리

다음 쿼리는 제품 카탈로그 설명에서 제품 모델 ID와 중량(있는 경우)을 반환합니다. 쿼리는 다음 형식의 XML을 생성합니다.

<Product ProductModelID="…">
  <Weight>…</Weight>
</Product>

다음은 쿼리입니다.

SELECT CatalogDescription.query('
declare namespace p1="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
  <Product  ProductModelID="{ (/p1:ProductDescription/@ProductModelID)[1] }">
     { 
       /p1:ProductDescription/p1:Specifications/Weight 
     } 
  </Product>
') as Result
FROM Production.ProductModel
WHERE CatalogDescription is not null

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

  • XQuery 프롤로그의 namespace 키워드는 쿼리 본문에서 사용되는 네임스페이스 접두사를 정의합니다.

  • 쿼리 본문은 필요한 XML을 생성합니다.

  • WHERE 절에서는 exist() 메서드를 사용하여 제품 카탈로그 설명이 포함된 행만 검색합니다. 즉, <ProductDescription> 요소가 포함된 XML을 검색합니다.

다음은 결과입니다.

<Product ProductModelID="19"/>
<Product ProductModelID="23"/> 
<Product ProductModelID="25"/> 
<Product ProductModelID="28"><Weight>Varies with size.</Weight></Product>
<Product ProductModelID="34"/>
<Product ProductModelID="35"/>

다음 쿼리는 카탈로그 설명에서 사양을 나타내는 <Specifications> 요소에 있는 중량을 나타내는 <Weight> 요소가 포함된 제품 모델에 대해서만 같은 정보를 검색합니다. 이 예에서는 WITH XMLNAMESPACES를 사용하여 pd 접두사와 해당 네임스페이스 바인딩을 선언합니다. 이 방식에서 바인딩은 query() 메서드 및 exist() 메서드에 모두 기술되지 않습니다.

WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT CatalogDescription.query('
          <Product  ProductModelID="{ (/pd:ProductDescription/@ProductModelID)[1] }">
                 { 
                      /pd:ProductDescription/pd:Specifications/Weight 
                 } 
          </Product>
') as x
FROM Production.ProductModel
WHERE CatalogDescription.exist('/pd:ProductDescription/pd:Specifications//Weight ') = 1

이전 쿼리에서 WHERE 절에 있는 xml 데이터 형식의 exist() 메서드는 <Specifications> 요소에 <Weight> 요소가 있는지 여부를 확인합니다.

2.카탈로그 설명에 소형 전면 사진이 포함된 제품 모델의 제품 모델 ID 검색

XML 제품 카탈로그 설명에는 <Picture> 요소에 제품 사진이 포함됩니다. 각 사진은 몇 가지 속성을 갖고 있습니다. 여기에는 사진 각도를 나타내는 <Angle> 요소와 크기를 나타내는 <Size> 요소가 포함됩니다.

카탈로그 설명에 소형 전면 사진이 포함된 제품 모델에 대해 이 쿼리는 다음과 같은 형식의 XML을 생성합니다.

< Product ProductModelID="…">
  <Picture>
    <Angle>front</Angle>
    <Size>small</Size>
  </Picture>
</Product>
WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT CatalogDescription.query('
   <pd:Product  ProductModelID="{ (/pd:ProductDescription/@ProductModelID)[1] }">
      <Picture>
         {  /pd:ProductDescription/pd:Picture/pd:Angle } 
         {  /pd:ProductDescription/pd:Picture/pd:Size } 
      </Picture>
   </pd:Product>
') as Result
FROM  Production.ProductModel
WHERE CatalogDescription.exist('/pd:ProductDescription/pd:Picture') = 1
AND   CatalogDescription.value('(/pd:ProductDescription/pd:Picture/pd:Angle)[1]', 'varchar(20)')  = 'front'
AND   CatalogDescription.value('(/pd:ProductDescription/pd:Picture/pd:Size)[1]', 'varchar(20)')  = 'small'

이전 쿼리에서 다음을 유의하십시오.

  • WHERE 절에서는 exist() 메서드를 사용하여 <Picture> 요소가 있는 제품 카탈로그 설명이 포함된 행만 검색합니다.

  • WHERE 절에서는 value() 메서드를 두 번 사용하여 <Size> 및 <Angle> 요소의 값을 비교합니다.

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

<p1:Product 
  xmlns:p1="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription" 
  ProductModelID="19">
  <Picture>
    <p1:Angle>front</p1:Angle>
    <p1:Size>small</p1:Size>
  </Picture>
</p1:Product>
...

3.제품 모델 이름과 기능이 <Features> 요소에 한 쌍으로 포함된 기본 목록 만들기

제품 모델 카탈로그 설명에서 XML에는 몇 가지 제품 기능이 포함됩니다. 이러한 모든 기능은 <Features> 요소에 포함됩니다. 쿼리는 XML 생성(XQuery)을 사용하여 필요한 XML을 생성합니다. 중괄호에 있는 식은 결과로 대체됩니다.

SELECT CatalogDescription.query('
declare namespace p1="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
  for $pd in /p1:ProductDescription,
   $f in $pd/p1:Features/*
  return
   <Feature>
     <ProductModelName> { data($pd/@ProductModelName) } </ProductModelName>
     { $f }
  </Feature>        
') as x
FROM Production.ProductModel
WHERE ProductModelID=19

이전 쿼리에서 다음을 유의하십시오.

  • $pd/p1:Features/*는 <Features>의 요소 노드 자식만 반환하지만 $pd/p1:Features/node()는 모든 노드를 반환합니다. 여기에는 요소 노드, 텍스트 노드, 처리 명령 및 주석이 포함됩니다.

  • 두 개의 FOR 루프는 제품 이름 및 개별 기능이 반환되는 카티션 곱을 생성합니다.

  • ProductName은 특성입니다. 이 쿼리의 XML 생성은 해당 항목을 요소로 반환합니다.

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

<Feature>
 <ProductModelName>Mountain 100</ProductModelName>
 <ProductModelID>19</ProductModelID>
 <p1:Warranty 
   xmlns:p1="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
    <p1:WarrantyPeriod>3 year</p1:WarrantyPeriod>
    <p1:Description>parts and labor</p1:Description>
 </p1:Warranty>
</Feature>
<Feature>
 <ProductModelName>Mountain 100</ProductModelName>
 <ProductModelID>19</ProductModelID>
 <p2:Maintenance xmlns:p2="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">
    <p2:NoOfYears>10</p2:NoOfYears>
    <p2:Description>maintenance contact available through your dealer 
           or any AdventureWorks retail store.</p2:Description>
    </p2:Maintenance>
</Feature>
...
...    

4.제품 모델의 카탈로그 설명에서 <Product> 요소 내에 그룹화된 제품 모델 이름, 모델 ID 및 기능 나열

다음 쿼리는 제품 모델의 카탈로그 설명에 저장된 정보를 사용하여 <Product> 요소 내에 그룹화된 제품 모델 이름, 모델 ID 및 기능을 나열합니다.

SELECT ProductModelID, CatalogDescription.query('
     declare namespace pd="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     <Product>
         <ProductModelName> 
           { data(/pd:ProductDescription/@ProductModelName) } 
         </ProductModelName>
         <ProductModelID> 
           { data(/pd:ProductDescription/@ProductModelID) } 
         </ProductModelID>
         { /pd:ProductDescription/pd:Features/* }
     </Product>        
') as x
FROM Production.ProductModel
WHERE ProductModelID=19

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

<Product>
  <ProductModelName>Mountain 100</ProductModelName>
  <ProductModelID>19</ProductModelID>
  <p1:Warranty>... </p1:Warranty>
  <p2:Maintenance>...  </p2:Maintenance>
  <p3:wheel xmlns:p3="http://www.adventure-works.com/schemas/OtherFeatures">High performance wheels.</p3:wheel>
  <p4:saddle xmlns:p4="http://www.adventure-works.com/schemas/OtherFeatures">
    <p5:i xmlns:p5="http://www.w3.org/1999/xhtml">Anatomic design</p5:i> and made from durable leather for a full-day of riding in comfort.</p4:saddle>
  <p6:pedal xmlns:p6="http://www.adventure-works.com/schemas/OtherFeatures">
    <p7:b xmlns:p7="http://www.w3.org/1999/xhtml">Top-of-the-line</p7:b> clipless pedals with adjustable tension.</p6:pedal>
   ...

5.제품 모델 기능 설명 검색

다음 쿼리는 ProducModelID, ProductModelName 특성 및 처음 두 개의 제품 기능이 포함된 <Product> 요소가 들어 있는 XML을 생성합니다. 특히 처음 두 개의 제품 기능은 <Features> 요소에 대한 처음 두 개의 자식 요소입니다. 기능이 더 많은 경우 빈 <There-is-more/> 요소를 반환합니다.

SELECT CatalogDescription.query('
declare namespace pd="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     <Product> 
          { /pd:ProductDescription/@ProductModelID }
          { /pd:ProductDescription/@ProductModelName } 
          {
            for $f in /pd:ProductDescription/pd:Features/*[position()<=2]
            return
            $f 
          }
          {
            if (count(/pd:ProductDescription/pd:Features/*) > 2)
            then <there-is-more/>
            else ()
          } 
     </Product>        
') as Result
FROM Production.ProductModel
WHERE CatalogDescription is not NULL

이전 쿼리에서 다음을 유의하십시오.

  • FOR ... RETURN 루프 구조는 처음 두 개의 제품 기능을 검색합니다. position() 함수를 사용하여 시퀀스에서 요소의 위치를 찾습니다.

6.제품 카탈로그 설명에서 "ons"로 끝나는 요소 이름 찾기

다음 쿼리는 카탈로그 설명을 검색하고 이름이 "ons"로 끝나는 <ProductDescription> 요소에 있는 모든 요소를 반환합니다.

SELECT ProductModelID, CatalogDescription.query('
     declare namespace p1="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
      for $pd in /p1:ProductDescription/*[substring(local-name(.),string-length(local-name(.))-2,3)="ons"]
      return 
          <Root>
             { $pd }
          </Root>
') as Result
FROM Production.ProductModel
WHERE CatalogDescription is not NULL

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

ProductModelID   Result
-----------------------------------------
         19        <Root>       
                     <p1:Specifications xmlns:p1="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">        
                          ...       
                     </p1:Specifications>       
                   </Root>        

7."Aerodynamic"이라는 단어가 포함된 요약 설명 찾기

다음 쿼리는 제품 카탈로그의 요약 설명에 "Aerodynamic"이라는 단어가 포함된 제품 모델을 검색합니다.

WITH XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)
SELECT ProductModelID, CatalogDescription.query('
          <Prod >
             { /pd:ProductDescription/@ProductModelID }
             { /pd:ProductDescription/pd:Summary }
          </Prod>
 ') as Result
FROM Production.ProductModel
WHERE CatalogDescription.value('
     contains( string( (/pd:ProductDescription/pd:Summary)[1] ),"Aerodynamic")','bit') = 1

SELECT 쿼리는 xml 데이터 형식의 query()value() 메서드를 지정합니다. 따라서 두 개의 서로 다른 쿼리 프롤로그에 있는 네임스페이스 선언을 두 번 반복하는 대신 pd 접두사가 쿼리에서 사용되고 WITH XMLNAMESPACES를 사용하여 한 번만 정의됩니다.

이전 쿼리에서 다음을 유의하십시오.

  • WHERE 절을 사용하여 카탈로그 설명에서 <Summary> 요소에 "Aerodynamic"이라는 단어가 들어 있는 행만 검색합니다.

  • contains() 함수를 사용하여 단어가 텍스트에 포함되는지 여부를 확인합니다.

  • xml 데이터 형식의 value() 메서드는 **contains()**로 반환된 값을 1과 비교합니다.

다음은 결과입니다.

ProductModelID Result      
-------------- ------------------------------------------
28     <Prod ProductModelID="28">
        <pd:Summary xmlns:pd="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">
       <p1:p xmlns:p1="http://www.w3.org/1999/xhtml">
         A TRUE multi-sport bike that offers streamlined riding and a
         revolutionary design. Aerodynamic design lets you ride with the 
         pros, and the gearing will conquer hilly roads.</p1:p>
       </pd:Summary>
      </Prod>  

8.카탈로그 설명에 제품 모델 사진이 포함되지 않은 제품 모델 찾기

다음 쿼리는 카탈로그 설명에 <Picture> 요소가 포함되지 않은 제품 모델에 대한 ProductModelID를 검색합니다.

SELECT  ProductModelID
FROM    Production.ProductModel
WHERE   CatalogDescription is not NULL
AND     CatalogDescription.exist('declare namespace p1="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     /p1:ProductDescription/p1:Picture
') = 0

이전 쿼리에서 다음을 유의하십시오.

  • WHERE 절에 있는 exist() 메서드가 False(0)를 반환하는 경우 제품 모델 ID가 반환됩니다. 그렇지 않으면 제품 모델 ID가 반환되지 않습니다.

  • 모든 제품 설명에는 <Picture> 요소가 포함되기 때문에 이 경우 결과 집합이 비어 있습니다.

참고 항목

참조

계층 포함 XQuery

정렬 포함 XQuery

관계형 데이터에 대한 XQuery 처리

XQuery의 네임스페이스 처리

개념

XQuery에서 문자열 검색

WITH XMLNAMESPACES를 사용하여 쿼리에 네임스페이스 추가

XML 데이터(SQL Server)

관련 자료

XQuery 언어 참조(SQL Server)