Share via


일반 XQuery 사용 사례

적용 대상:SQL Server

이 항목에서는 XQuery 사용에 대한 일반적인 예제를 제공합니다.

A. 카탈로그 설명을 쿼리하여 제품 및 가중치 찾기

다음 쿼리는 제품 카탈로그 설명에서 제품 모델 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 프롤로그의 네임스페이스 키워드는 쿼리 본문에 사용되는 네임스페이스 접두사를 정의합니다.

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

  • WHERE 절 에서 exist() 메서드는 제품 카탈로그 설명이 포함된 행만 찾는 데 사용됩니다. 즉, 요소가 포함된 XML입니다 <ProductDescription> .

결과는 다음과 같습니다.

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

다음 쿼리는 동일한 정보를 검색하지만 카탈로그 설명에 사양에서 요소의 가중치, <Weight> 요소를 포함하는 제품 모델에 대해서만 검색합니다.<Specifications> 이 예제에서는 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() 메서드는Weight<> 요소에 <Specifications> 요소가 있는지 확인합니다.

B. 카탈로그 설명에 전면 각도 및 작은 크기의 그림이 포함된 제품 모델에 대한 제품 모델 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() 메서드를 두 번 사용하여 값과Angle><요소의 <>Size값을 비교합니다.

이는 부분적인 결과입니다.

<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>  
...  

C. 각 쌍이 Features> 요소로 묶인 제품 모델 이름 및 기능 쌍의 <플랫 목록을 만듭니다.

제품 모델 카탈로그 설명에서 XML에는 여러 제품 기능이 포함되어 있습니다. 이러한 모든 기능은 요소에 <Features> 포함됩니다. 이 쿼리는 XQuery(XML 생성)를 사용하여 필요한 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>  
...  
...      

D. 제품 모델에 대한 카탈로그 설명에서 Product 요소 내부에 <> 그룹화된 제품 모델 이름, 모델 ID 및 기능을 나열합니다.

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

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>  
   ...  

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

다음 쿼리는 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() 함수는 시퀀스에서 요소의 위치를 찾는 데 사용됩니다.

F. 제품 카탈로그 설명에서 "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>          

G. "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 절은 카탈로그 설명에 요소의 "Aerodynamic"이라는 단어가 포함된 행만 검색하는 <Summary> 데 사용됩니다.

  • 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>    

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

다음 쿼리는 카탈로그 설명에 요소가 포함되지 <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가 반환됩니다. 그렇지 않으면 반환되지 않습니다.

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

참고 항목

계층 포함 XQuery
주문과 관련된 XQueries
관계형 데이터 처리 XQueries
XQuery의 문자열 검색
XQuery에서 네임스페이스 처리
WITH XMLNAMESPACES를 사용하여 쿼리에 네임스페이스 추가
XML 데이터(SQL Server)
XQuery 언어 참조(SQL Server)