Megosztás:


Elérésiút-kifejezések – Tengely megadása

A következőkre vonatkozik:SQL Server

Egy elérésiút-kifejezés tengelylépése a következő összetevőket tartalmazza:

További információ: Path Expressions (XQuery).

Az SQL Server XQuery implementációja a következő tengelylépéseket támogatja:

Tengely Leírás
gyermek A környezeti csomópont gyermekeit adja vissza.
leszármazott A környezeti csomópont összes leszármazottját adja vissza.
szülő A környezeti csomópont szülőjének értékét adja vissza.
attribútum A környezeti csomópont attribútumait adja vissza.
saját A környezeti csomópontot adja vissza.
leszármazott vagy önkiszolgáló A környezeti csomópontot és a környezeti csomópont összes leszármazottját adja vissza.

Ezek a tengelyek a szülőtengely kivételével előre tengelyek. A szülő- tengely fordított tengely, mivel visszafelé keres a dokumentumhierarchiában. A relatív elérési út kifejezés child::ProductDescription/child::Summary például két lépésből áll, és mindegyik lépés egy child tengelyt határoz meg. Az első lépés lekéri a környezeti csomópont <ProductDescription> elemét. Minden <ProductDescription> elemcsomópont esetében a második lépés lekéri a <Összefoglaló> elemcsomópont gyermekeit.

A relatív elérési út kifejezésének (child::root/child::Location/attribute::LocationID) három lépésből áll. Az első két lépés egy child tengelyt, a harmadik lépés pedig a attribute tengelyt adja meg. Amikor a Gyártási.ProductModel táblában a gyártási utasítások XML-dokumentumait hajtja végre, a kifejezés a <gyökér> elem <Hely> elemcsomópontjának LocationID attribútumát adja vissza.

Példák

A jelen témakörben szereplő lekérdezési példák xml típusú oszlopokon vannak megadva az AdventureWorks adatbázisban.

Egy. Gyermektengely megadása

Egy adott termékmodell esetében az alábbi lekérdezés lekéri a <ProductDescription> elemcsomópont <Szolgáltatások> elemcsomópont gyermekeit a Production.ProductModel táblában tárolt termékkatalógus-leírásból.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  /child::PD:ProductDescription/child::PD:Features')  
FROM Production.ProductModel  
WHERE ProductModelID=19  

Jegyezze fel az előző lekérdezésben szereplő következőket:

  • Az xml adattípus query() metódusa határozza meg az elérési utat.

  • Az elérési út kifejezésének mindkét lépése egy child tengelyt és a csomópontok nevét, ProductDescription és Featureshatároz meg csomóponttesztekként. További információ a csomóponttesztekről: Csomópontteszt megadása elérési útkifejezési lépésben.

B. Leszármazott és leszármazó vagy önkiszolgáló tengelyek megadása

Az alábbi példa leszármazó és leszármazott vagy önalázó tengelyeket használ. A jelen példában szereplő lekérdezés egy xml- típusú változóhoz van megadva. Az XML-példány egyszerűbb, így egyszerűen szemléltethető a létrehozott eredmények különbsége.

declare @x xml  
set @x='  
<a>  
 <b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
 </b>  
</a>'  
declare @y xml  
set @y = @x.query('  
  /child::a/child::b  
')  
select @y  

A következő eredményben a kifejezés a <a> elemcsomópont <b> elemcsomópont gyermekét adja vissza:

<b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
</b>  

Ebben a kifejezésben, ha egy leszármazott tengelyt ad meg az elérési út kifejezéséhez,

/child::a/child::b/descendant::*a <b> elemcsomópont összes leszármazottját kéri.

A csomópontteszt csillaga (*) csomóponttesztként jelöli a csomópont nevét. Ezért a leszármazott tengely elsődleges csomóponttípusa, az elemcsomópont határozza meg a visszaadott csomóponttípusokat. Ez azt jelzi, hogy a kifejezés az összes elemcsomópontot visszaadja. A rendszer nem ad vissza szöveges csomópontokat. Az elsődleges csomópont típusával és a csomóponttesztel való kapcsolatával kapcsolatos további információkért lásd: Csomópontteszt megadása az Elérési út kifejezésének lépése témakörben.

A rendszer visszaadja a <c> és a <d> elemcsomópontokat, ahogy az az alábbi eredményben is látható:

<c>text2  
     <d>text3</d>  
</c>  
<d>text3</d>  

Ha a leszármazó tengely helyett egy leszármazott- vagy öntengelyt ad meg, /child::a/child::b/descendant-or-self::* a környezeti csomópontot, a <b>elemet és annak leszármazottját adja vissza.

Ez az eredmény:

<b>text1  
   <c>text2  
     <d>text3</d>  
   </c>  
</b>  
  
<c>text2  
     <d>text3</d>  
</c>  
  
<d>text3</d>   

A AdventureWorks-adatbázishoz tartozó alábbi minta lekérdezés lekéri a <ProductDescription> elem gyermekelemének <Features> elemének összes leszármazottelem-csomópontját:

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  /child::PD:ProductDescription/child::PD:Features/descendant::*  
')  
FROM  Production.ProductModel  
WHERE ProductModelID=19  

C. Szülőtengely megadása

Az alábbi lekérdezés a Production.ProductModel táblában tárolt termékkatalógus XML-dokumentumának <ProductDescription> elemének <Summary> elemét adja vissza.

Ez a példa a szülőtengely használatával tér vissza a <Feature> elem szülőjének, és lekéri a <ProductDescription> elem <Summary> elemének gyermekét.

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
  
/child::PD:ProductDescription/child::PD:Features/parent::PD:ProductDescription/child::PD:Summary  
')  
FROM   Production.ProductModel  
WHERE  ProductModelID=19  
  

Ebben a lekérdezési példában az elérési út kifejezés a parent tengelyt használja. A kifejezést a szülőtengely nélkül is átírhatja, ahogy az alábbi ábrán látható:

/child::PD:ProductDescription[child::PD:Features]/child::PD:Summary  

Az alábbi példában a szülőtengely egy hasznosabb példáját mutatjuk be.

A ProductModel tábla CatalogDescription oszlopában tárolt termékmodell-katalógus leírása tartalmaz egy <ProductDescription> elemet, amely tartalmazza a ProductModelID attribútumot és <Features> gyermekelemet, ahogyan az a következő töredékben látható:

<ProductDescription ProductModelID="..." >  
  ...  
  <Features>  
    <Feature1>...</Feature1>  
    <Feature2>...</Feature2>  
   ...  
</ProductDescription>  

A lekérdezés egy $fiterátorváltozót állít be az FLWOR utasításban a <Features> elem gyermekeinek visszaadásához. További információ: FLWOR utasítás és iteráció (XQuery). Az return záradék minden egyes funkcióhoz létrehoz egy XML-t az alábbi formában:

<Feature ProductModelID="...">...</Feature>  
<Feature ProductModelID="...">...</Feature>  

Az egyes <Feature> elemek ProductModelID hozzáadásához a parent tengely van megadva:

SELECT CatalogDescription.query('  
declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
declare namespace wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";  
  for $f in /child::PD:ProductDescription/child::PD:Features/child::*  
  return  
   <Feature  
     ProductModelID="{ ($f/parent::PD:Features/parent::PD:ProductDescription/attribute::ProductModelID)[1]}" >  
          { $f }  
   </Feature>  
')  
FROM  Production.ProductModel  
WHERE ProductModelID=19  

Ez a részleges eredmény:

<Feature ProductModelID="19">  
  <wm:Warranty   
   xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <wm:WarrantyPeriod>3 years</wm:WarrantyPeriod>  
    <wm:Description>parts and labor</wm:Description>  
  </wm:Warranty>  
</Feature>  
<Feature ProductModelID="19">  
  <wm:Maintenance   
   xmlns:wm="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain">  
    <wm:NoOfYears>10 years</wm:NoOfYears>  
    <wm:Description>maintenance contract available through your dealer   
                  or any AdventureWorks retail store.</wm:Description>  
  </wm:Maintenance>  
</Feature>  
<Feature ProductModelID="19">  
  <p1:wheel   
   xmlns:p1="https://www.adventure-works.com/schemas/OtherFeatures">  
      High performance wheels.  
  </p1:wheel>  
</Feature>  

Vegye figyelembe, hogy az elérésiút-kifejezésben szereplő predikátum [1] annak biztosítása érdekében, hogy egy egyenérték legyen visszaadva.