다음을 통해 공유


일반 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 프롤로그의 키워드는 namespace 쿼리 본문에 사용되는 네임스페이스 접두사를 정의합니다.

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

  • exist() 에서 WHERE 이 메서드는 제품 카탈로그 설명이 포함된 행만 찾는 데 사용됩니다. 즉, 요소가 포함된 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> . 이 예제에서는 접두사 및 해당 네임스페이스 바인딩을 선언 pd 하는 데 사용합니다WITH XMLNAMESPACES. 이러한 방식으로 바인딩은 메서드와 exist() 메서드 모두에서 query() 설명되지 않습니다.

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;

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

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'

이전 쿼리의 다음 고려 사항에 유의하세요.

  • WHEREexist() 에서 이 메서드는 요소와 함께 <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> 포함됩니다. 쿼리는 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>
...
...

D. 제품 모델에 대한 카탈로그 설명에서 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>
   ...

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

다음 쿼리는 특성, 처음 두 제품 기능이 있는 ProductModelIDProductModelName 요소를 포함하는 <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;

이전 쿼리의 다음 고려 사항에 유의하세요.

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

F. 제품 카탈로그 설명에서 끝나는 요소 이름을 찾습니다. ons

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

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;

쿼리는 SELECTxml 데이터 형식의 메서드와 value() 지정 query() 합니다. 따라서 두 개의 차이 쿼리 프롤로그에서 네임스페이스 선언을 두 번 반복하는 대신, 접두 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;

이전 쿼리의 다음 고려 사항에 유의하세요.

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

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