Megosztás:


Általános XQuery használati esetek

A következőkre vonatkozik:SQL Server

Ez a cikk általános példákat tartalmaz az XQuery használatára.

Példák

Egy. Katalógusleírások lekérdezése termékek és súlyok kereséséhez

Az alábbi lekérdezés a termékkatalógus leírásából adja vissza a termékmodell azonosítóit és súlyait, ha léteznek. A lekérdezés az alábbi formátumú XML-t hozza létre:

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

A lekérdezés a következő:

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;

Vegye figyelembe az előző lekérdezés alábbi szempontjait:

  • Az namespace XQuery prolog kulcsszója a lekérdezés törzsében használt névtérelőtagot definiálja.

  • A lekérdezés törzse a szükséges XML-fájlt hozza létre.

  • WHERE A záradékban a exist() metódus csak olyan sorokat keres, amelyek termékkatalógus-leírásokat tartalmaznak. Vagyis az elemet tartalmazó <ProductDescription> XML.

Az eredmény a következő:

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

Az alábbi lekérdezés ugyanazokat az információkat kéri le, de csak azokra a termékmodellekre vonatkozóan, amelyek katalógusleírása tartalmazza a súlyt, az <Weight> elemet a specifikációkban.<Specifications> Ez a példa az előtag és a pd névtérkötés deklarálásához használWITH XMLNAMESPACES. Ily módon a kötés nem írható le a metódusban és a query()exist() metódusban sem.

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;

Az előző lekérdezésben a exist() záradék xml-adattípusánakWHERE metódusa ellenőrzi, hogy van-e <Weight> elem az <Specifications> elemben.

B. Termékmodell-azonosítók keresése olyan termékmodellekhez, amelyek katalógusleírásai előtér- és kis méretű képeket tartalmaznak

Az XML-termékkatalógus leírása tartalmazza a termékképeket és az <Picture> elemet. Minden kép több tulajdonsággal rendelkezik, beleértve a kép szögét (az <Angle> elemet) és a méretet (az <Size> elemet).

Azon termékmodellek esetében, amelyek katalógusleírásai előtér- és kis méretű képeket tartalmaznak, a lekérdezés az alábbi formátumú XML-t hozza létre:

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

Vegye figyelembe az előző lekérdezés alábbi szempontjait:

  • WHERE A záradékban a metódus csak azokat a exist() sorokat kéri le, amelyek termékkatalógus-leírással rendelkeznek az <Picture> elemhez.

  • A WHERE záradék két alkalommal használja a value() metódust az elemek és <Angle> az elemek értékeinek összehasonlítására<Size>.

Íme egy részleges eredmény:

<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. A termékmodell nevének és funkciópárjainak egyszerű listájának létrehozása a <Szolgáltatások> elemben található párokkal

A termékmodell-katalógus leírásában az XML számos termékfunkciót tartalmaz. Ezek a funkciók az elem részét <Features> képezik. A lekérdezés XML-konstrukciót (XQuery) használ a szükséges XML létrehozásához. A kapcsos zárójelek kifejezését az eredmény váltja fel.

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;

Vegye figyelembe az előző lekérdezés alábbi szempontjait:

  • $pd/p1:Features/* csak az elemcsomópont gyermekeit <Features>adja vissza, de $pd/p1:Features/node() az összes csomópontot visszaadja. Ide tartoznak az elemcsomópontok, a szövegcsomópontok, a feldolgozási utasítások és a megjegyzések.

  • A két FOR hurok létrehoz egy Cartesian-terméket, amelyből a termék neve és az egyedi funkció lesz visszaadva.

  • Ez ProductName egy attribútum. A lekérdezés XML-felépítése elemként adja vissza.

Íme egy részleges eredmény:

<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. A termékmodell katalógusleírásában adja meg a termékmodell nevét, a modellazonosítót és a <Termék> elembe csoportosított funkciókat

A termékmodell katalógusleírásában tárolt információk alapján az alábbi lekérdezés felsorolja a termékmodell nevét, a modell azonosítóját és az <Product> elemekbe csoportosított funkciókat.

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;

Íme egy részleges eredmény:

<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. Termékmodell funkcióleírásainak lekérése

Az alábbi lekérdezés olyan XML-fájlt hoz létre, amely tartalmaz egy <Product> olyan elemet, amely rendelkezik ProductModelIDattribútumokkal ProductModelName és az első két termékfunkcióval. Pontosabban az első két termékfunkció az elem első két gyermekeleme <Features> . Ha több funkció is van, az üres <There-is-more/> elemet ad vissza.

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;

Vegye figyelembe az előző lekérdezés alábbi szempontjait:

  • A FOR ... RETURN ciklusstruktúra lekéri az első két termékfunkciót. A position() függvény az elemek pozíciójának megkeresésére szolgál a sorozatban.

F. Elemnevek keresése a termékkatalógus leírásából ons

Az alábbi lekérdezés megkeresi a katalógus leírását, és visszaadja az elem összes elemét<ProductDescription>, amelynek a neve végződik.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;

Íme egy részleges eredmény:

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

G. Az "Aerodynamic" szót tartalmazó összefoglaló leírások keresése

Az alábbi lekérdezés lekéri azokat a termékmodelleket, amelyek katalógusleírásai tartalmazzák az "Aerodynamic" szót az összefoglaló leírásban:

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;

A SELECT lekérdezés az xml-adattípust és value() metódusokat határozza megquery(). Ezért a névterek deklarációjának két különböző lekérdezési prologban való kétszeri ismétlése helyett a rendszer az előtagot pd használja a lekérdezésben, és csak egyszer definiálja a lekérdezés használatával WITH XMLNAMESPACES.

Vegye figyelembe az előző lekérdezés alábbi szempontjait:

  • A WHERE záradék csak azokat a sorokat kéri le, ahol a katalógus leírása tartalmazza az "Aerodynamic" szót az <Summary> elemben.

  • A contains() függvény segítségével megállapíthatja, hogy a szó szerepel-e a szövegben.

  • Az value()xml-adattípus metódusa az 1 által visszaadott contains() értéket hasonlítja össze.

Az eredmény a következő:

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. Olyan termékmodellek keresése, amelyek katalógusleírásai nem tartalmazzák a termékmodell képeit

Az alábbi lekérdezés lekéri az olyan termékmodellek termékmodelljeit, amelyek katalógusleírásai nem tartalmaznak <Picture> elemet.

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;

Vegye figyelembe az előző lekérdezés alábbi szempontjait:

  • Ha a exist() záradékban szereplő WHERE metódus hamis (0) értéket ad vissza, a rendszer visszaadja a termékmodell azonosítóját. Ellenkező esetben a függvény nem adja vissza.

  • Mivel az összes termékleírás tartalmaz egy <Picture> elemet, az eredményhalmaz ebben az esetben üres.