다음을 통해 공유


일반 XQuery 사용 사례

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

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

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

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

다음은 쿼리입니다.

SELECT CatalogDescription.query('
declare namespace p1="https://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 ('https://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 ('https://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="https://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="https://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="https://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="https://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="https://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="https://www.adventure-works.com/schemas/OtherFeatures">High performance wheels.</p3:wheel>
  <p4:saddle xmlns:p4="https://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="https://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="https://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="https://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="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription">        
                          ...       
                     </p1:Specifications>       
                   </Root>        

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

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

WITH XMLNAMESPACES ('https://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="https://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="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
     /p1:ProductDescription/p1:Picture
') = 0

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

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

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