Udostępnij przez


Użyj XQuery ogólne sprawy

W tym temacie przedstawiono ogólne przykładach XQuery.

Przykłady

A.Kwerenda wykazu opisy można znaleźć produkty i wagi

Następująca kwerenda zwraca iloczyn identyfikatory modelu oraz, jeśli takie istnieją, z opis katalogu produktów.Kwerendy konstrukcji XML, który ma następującą postać:

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

To jest kwerenda:

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

Pierwszy przycisk jest przyciskiem domyślnym.

  • The namespace keyword in the XQuery prolog defines a namespace prefix that is used in the query body.

  • Treść kwerendy konstruuje wymagane XML.

  • W klauzula WHERE EXIST() metoda jest używana do wyszukiwania tylko wiersze zawierające opisy katalog produktów.Oznacza to, XML, który zawiera <ProductDescription> element.

To jest wynik:

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

Następująca kwerenda pobiera te same informacje, ale tylko dla tych modeli produktu opis katalogu zawiera wagę, <Weight> element w specyfikacji, <Specifications> element. W tym przykładzie użyto WITH XMLNAMESPACES zadeklarować prefiks pd i jego wiązania obszaru nazw.W ten sposób wiązanie nie opisano w obu Query() Metoda iEXIST() metody.

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

W poprzedniej kwerendy EXIST() Metoda XML typ danych w klauzula WHERE sprawdza, czy jest elementem <Weight> <Specifications> elementu.

B.Znaleźć nazwy modelu produktu dla modeli produktów, których opis wykazu dołączyć obrazy z przodu kąt i mały rozmiar

Opis wykazu produktów XML zawiera obrazy produktu <Picture> element. Każdy obraz ma kilka właściwości.Obejmują one kąt obraz <Angle> element i rozmiar, <Size> element.

Dla modeli produktów, których opis wykazu dołączyć obrazy z przodu kąt i mały rozmiar kwerendy konstrukcji XML, który ma następującą postać:

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

Pierwszy przycisk jest przyciskiem domyślnym.

  • W klauzula WHERE EXIST() metoda jest używana w celu pobrania tylko tych wierszy, które zawierają opisy katalog produktów z elementem <Picture> .

  • Użyto klauzula WHERE Value() metoda dwa razy na porównywaniu wartości o <Size> <Angle> elementów.

Jest to wynik częściowy:

<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.Tworzenie modelu pary nazw i funkcji, płaska lista produktu z każdej pary w nawiasach <Funkcje> element

W opisie wykazu modelu produktu kod XML zawiera kilka funkcji produktu.Funkcje te są zawarte w <Features> element. W kwerendzie użyto Budowa XML (XQuery) do konstruowania wymagane XML.Wyrażenie w nawiasy klamrowe zastępuje wynik.

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

Pierwszy przycisk jest przyciskiem domyślnym.

  • $ pd / p1:Features / * zwraca tylko elementy podrzędne węzła <Features>, ale $pd/p1:Features/node() zwraca wszystkie węzły. Obejmuje to węzły elementu, węzły tekst, instrukcje przetwarzania i komentarze.

  • Dwa do pętli generowanie kartezjański, z którego zwracana jest nazwa produktu i poszczególnych funkcji.

  • The ProductName is an atrybut.Konstrukcji XML w tej kwerendzie zwraca ją do elementu.

Jest to wynik częściowy:

<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.Z opisem wykazu modelu produktu, produkt listy modelu identyfikator nazwę, model, a funkcje zgrupowane wewnątrz <Produkt> element

Korzystając z informacji przechowywanych w katalogu opis modelu produktu, poniższa kwerenda wyświetla nazwę modelu produktu, identyfikator modelu i funkcje zgrupowane wewnątrz <Produkt> element.

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

Jest to wynik częściowy:

<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.Pobrać opisy funkcji modelu produktu

Poniższa kwerenda tworzy XML, który zawiera <Product> element, który ma ProducModelID, ProductModelName atrybuty i pierwszym funkcji dwóch produktów.W szczególności pierwszego funkcje dwóch produktów są pierwsze elementów podrzędność dwóch <Features> element. W przypadku większej liczby funkcji zwraca pusty <There-is-more/> element.

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

Pierwszy przycisk jest przyciskiem domyślnym.

  • FOR...Struktura RETURN pętli pobiera pierwszy funkcji dwóch produktów.The position() funkcja is used to find the position of the elements in the sequence.

F.Znaleźć nazwy elementu z opis katalogu produktów, których nazwa kończy się frazą "dodatków"

Następująca kwerenda przeszukuje opisy wykazu i zwraca wszystkie elementy w <ProductDescription>element, którego nazwa kończy się na "dodatków".

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

Jest to wynik częściowy:

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

G.Znaleźć opisy podsumowania, zawierające wyraz "Aerodynamic"

Następująca kwerenda pobiera modeli produktów, których opisy katalogu zawiera wyraz "Aerodynamic" w opisie podsumowania:

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

Należy zauważyć, że określa kwerendy WYBIERAJĄCEJ Query() and Value() metodXML typ danych.Dlatego zamiast powtarzanej deklaracja obszarów nazw dwa razy w dwóch prologs kwerendy różnica, prefiks pd jest używana w kwerendzie i jest zdefiniowany tylko raz przy użyciu XMLNAMESPACES WITH.

Pierwszy przycisk jest przyciskiem domyślnym.

  • Klauzula WHERE jest używana w celu pobrania tylko tych wierszy, opis katalogu zawiera wyraz "Aerodynamic" w <Summary> element.

  • The contains() funkcja is used to see if the word is included in the text.

  • The value() metoda of the xml data type compares the value returned by contains() to 1.

To jest wynik:

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.Znajdź modele produktów, których opis wykazu nie należy dołączać obrazy modelu produktu

Następujące kwerendy pobiera ProductModelIDs dla produktu modele opisów którego katalog nie zawierają <Picture> element.

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

Pierwszy przycisk jest przyciskiem domyślnym.

  • Jeśli EXIST() metoda w klauzula WHERE zwraca wartość false (0), zwracana jest identyfikator modelu produktu.W przeciwnym razie go nie jest zwracane.

  • Ponieważ zawiera opisy produktów <Picture> element, zestaw wyników jest pusty w w tym przypadek.