Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
A következőkre vonatkozik:SQL Server
Egy elérésiút-kifejezés tengelylépése a következő összetevőket foglalja magában:
Csomópontteszt
További információ: Path Expressions (XQuery).
A csomópont-teszt egy feltétel, és a tengelylépés második összetevője egy útvonal-kifejezésben. A lépésben kiválasztott összes csomópontnak meg kell felelnie ennek a feltételnek. Az elérési út kifejezéséhez /child::ProductDescription, a csomópontteszt: ProductDescription. Ez a lépés csak azokat az elemcsomópont-gyermekeket kéri le, akiknek a neve ProductDescription.
A csomóponttesztelési feltétel a következőket tartalmazhatja:
Csomópont neve. Csak a megadott nevű főcsomópontok kerülnek visszaadásra.
Csomóponttípus. A rendszer csak a megadott típusú csomópontokat adja vissza.
Jegyzet
Az XQuery elérési út kifejezésekben megadott csomópontnevek nem tartoznak ugyanolyan érzékeny összehasonlítási szabályok alá, mint a Transact-SQL lekérdezések, és mindig kis- és nagybetű-érzékenyek.
Csomópont neve csomóponttesztként
Amikor csomópontnevet ad meg csomóponttesztként egy elérésiút-kifejezési lépésben, meg kell értenie a fő csomóponttípus fogalmát. Minden tengely, gyermek, szülő vagy attribútum rendelkezik fő csomópont típussal. Például:
Az attribútumtengelyek csak attribútumokat tartalmazhatnak. Ezért az attribútumcsomópont az attribútumtengely fő csomóponttípusa.
Más tengelyek esetében, ha a tengely által kijelölt csomópontok tartalmazhatnak elemcsomópontokat, az elem az adott tengely fő csomóponttípusa.
Ha csomópontnevet ad meg csomóponttesztként, a lépés a következő csomóponttípusokat adja vissza:
A tengely fő csomóponttípusához tartozó csomópontok.
Azok a csomópontok, amelyek neve megegyezik a csomóponttesztben megadott névvel.
Vegyük például a következő elérésiút-kifejezést:
child::ProductDescription
Ez az egylépéses kifejezés egy child tengelyt és a csomópont nevét, ProductDescription-et mint csomóponttesztet határoz meg. A kifejezés csak azokat a csomópontokat adja vissza, amelyek a gyermektengely, elemcsomópontok fő csomóponttípusához tartoznak, és amelyek neve ProductDescription.
A /child::PD:ProductDescription/child::PD:Features/descendant::*, elérési út kifejezésének három lépése van. A következő lépések a gyermek- és leszármazott tengelyeket határozzák meg. Minden lépésben a csomópont neve lesz megadva csomóponttesztként. A harmadik lépésben a helyettesítő karakter (*) az alaptípusú csomópont minden csomópontját jelzi a leszármazási tengely számára. A tengely fő csomóponttípusa határozza meg a kijelölt csomópontok típusát, és a csomópont neve szűri a kijelölt csomópontokat.
Ennek eredményeképpen, amikor ezt a kifejezést végrehajtják a ProductModel táblában lévő termékkatalógus XML-dokumentumokon, lekéri a <ProductDescription> elem <Features> elemcsomópont-gyermekének összes elemcsomópont-gyermekét.
Az elérési út kifejezés (/child::PD:ProductDescription/attribute::ProductModelID) két lépésből áll. Mindkét lépés csomópont-tesztként megadja a csomópont nevét. A második lépés az attribútumtengelyt is használja. Ezért minden lépés kiválasztja a tengelye fő csomóponttípusának csomópontjait, amelyeknek a neve a csomóponttesztként van megadva. A kifejezés így ProductModelID attribútumcsomópontot adja vissza a <ProductDescription> elemcsomóponthoz.
A csomóponttesztekhez használt csomópontok nevének megadásakor a helyettesítő karakter (*) használatával is megadhatja a csomópont vagy a névtér előtagjának helyi nevét, ahogyan az az alábbi példában látható:
declare @x xml
set @x = '
<greeting xmlns="ns1">
<salutation>hello</salutation>
</greeting>
<greeting xmlns="ns2">
<salutation>welcome</salutation>
</greeting>
<farewell xmlns="ns1" />'
select @x.query('//*:greeting')
select @x.query('declare namespace ns="ns1"; /ns:*')
Csomóponttípus csomóponttesztként
Az elemcsomópontoktól eltérő csomóponttípusok lekérdezéséhez használjon csomóponttípus-tesztet. Az alábbi táblázatban látható módon négy csomóponttípus-teszt érhető el.
| Csomópont típusa | Visszatér | Példa |
|---|---|---|
comment() |
Megjegyzéscsomópont esetén igaz. |
following::comment() kijelöli a környezeti csomópont után megjelenő összes megjegyzéscsomópontot. |
node() |
Bármilyen csomópont esetén igaz. |
preceding::node() kijelöli a környezeti csomópont előtt megjelenő összes csomópontot. |
processing-instruction() |
Igaz egy feldolgozási utasításcsomópontra. |
self::processing instruction() kijelöli a környezeti csomóponton belüli összes feldolgozási utasításcsomópontot. |
text() |
Szövegcsomópont esetén igaz. |
child::text() kijelöli a kontextus csomópont gyermekeinek szövegcsomópontjait. |
Ha a csomóponttípus ( például szöveg() vagy megjegyzés() ...) csomóponttesztként van megadva, a lépés csak a megadott típusú csomópontokat adja vissza, függetlenül a tengely fő csomóponttípusától. Például az alábbi útvonal-kifejezés csak a kontextus csomópont kommentcsomópont gyermekeit adja vissza.
child::comment()
Hasonlóképpen, /child::ProductDescription/child::Features/child::comment() a <ProductDescription> elemcsomóponthoz tartozó <Szolgáltatások> elemcsomópont gyermekének megjegyzéscsomópont-gyermekeit kéri le.
Példák
Az alábbi példák a csomópont nevét és a csomóponttípust hasonlítják össze.
Egy. A csomópontnév és a csomóponttípus csomóponttesztként való megadásának eredményei egy elérésiút-kifejezésben
Az alábbi példában egy egyszerű XML-dokumentum van hozzárendelve egy xml- típusú változóhoz. A dokumentum lekérdezése különböző elérésiút-kifejezések használatával történik. A rendszer ezután összehasonlítja az eredményeket.
declare @x xml
set @x='
<a>
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
</a>'
select @x.query('
/child::a/child::b/descendant::*
')
Ez a kifejezés a <b> elemcsomópont leszármazottelem-csomópontjait kéri.
A csomóponttesztben a csillag (*) a csomópontnév helyettesítő karakterét jelzi. A leszármazott tengely elsődleges csomóponttípusa az elemcsomópont. Ezért a kifejezés az <b>elemcsomópont összes leszármazóelem-csomópontját adja vissza. Ez azt jelenti, hogy az elemcsomópontok <c> és <d> lesznek visszaadva, ahogy az az alábbi eredményben is látható:
<c>text2
<d>text3</d>
</c>
<d>text3</d>
Ha a leszármazási tengely megadása helyett egy csökkenő vagy önálló tengelyt ad meg, a rendszer a környezeti csomópontot és annak leszármazottait is visszaadja:
/child::a/child::b/descendant-or-self::*
Ez a kifejezés az elemcsomópontot <b> és annak leszármazottelem-csomópontjait adja vissza. A leszármazó csomópontok visszaadásakor a leszármazási vagy öntengely elsődleges csomóponttípusa, az elemcsomópont típusa határozza meg, hogy milyen típusú csomópontokat adnak vissza.
Ez az eredmény:
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
<c>text2
<d>text3</d>
</c>
<d>text3</d>
Az előző kifejezés egy helyettesítő karaktert használt csomópontnévként. Ehelyett használhatja a node() függvényt, ahogyan az ebben a kifejezésben látható:
/child::a/child::b/descendant::node()
Mivel node() csomóponttípus, a leszármazott tengely összes csomópontját megkapja. Ez az eredmény:
text1
<c>text2
<d>text3</d>
</c>
text2
<d>text3</d>
text3
Ha a csomóponttesztként megadja a leszármazó- vagy öntengelyt, és node(), az összes leszármazót, elemet és szöveges csomópontot, valamint a környezeti csomópontot, a <b> elemet fogja megkapni.
<b>text1
<c>text2
<d>text3</d>
</c>
</b>
text1
<c>text2
<d>text3</d>
</c>
text2
<d>text3</d>
text3
B. Csomópontnév megadása a csomóponttesztben
Az alábbi példa egy csomópontnevet ad meg csomóponttesztként az összes elérésiút-kifejezésben. Ennek eredményeképpen az összes kifejezés a tengely fő csomóponttípusának olyan csomópontjait adja vissza, amelyek a csomóponttesztben megadott csomópontnévvel rendelkeznek.
A következő lekérdezési kifejezés a Production.ProductModel táblában tárolt termékkatalógus XML-dokumentumának <Warranty> elemét adja vissza:
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";
/child::PD:ProductDescription/child::PD:Features/child::wm:Warranty
')
FROM Production.ProductModel
WHERE ProductModelID=19
Jegyezze fel az előző lekérdezésben szereplő következőket:
Az XQuery prolog
namespacekulcsszója a lekérdezés törzsében használt előtagot határozza meg. További információ az XQuery prologról: XQuery Prolog.Az elérésiút-kifejezés mindhárom lépése a gyermektengelyt és a csomópont nevét adja meg csomóponttesztként.
A tengelylépés választható lépés-minősítő része nincs megadva a kifejezés egyik lépésében sem.
A lekérdezés a <ProductDescription> elem <Features> elem gyermekének <Warranty> elemét adja vissza.
Ez az eredmény:
<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>
Az alábbi lekérdezésben az elérési út kifejezés egy helyettesítő karaktert (*) határoz meg egy csomóponttesztben.
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";
/child::PD:ProductDescription/child::PD:Features/child::*
')
FROM Production.ProductModel
WHERE ProductModelID=19
A csomópont nevéhez a helyettesítő karakter van megadva. Így a lekérdezés visszaadja a <ProductDescription> elemcsomópont <Features> elemcsomópont gyermekének összes elemcsomópontját.
Az alábbi lekérdezés hasonló az előző lekérdezéshez, azzal a kivétellel, hogy a helyettesítő karakterrel együtt meg van adva egy névtér. Ennek eredményeképpen a rendszer visszaadja a névtérben lévő összes elemcsomópont gyermekét. Vegye figyelembe, hogy a <Features> elem különböző névterek elemeit tartalmazhatja.
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";
/child::PD:ProductDescription/child::PD:Features/child::wm:*
')
FROM Production.ProductModel
WHERE ProductModelID=19
A helyettesítő karaktert névtérelőtagként használhatja, ahogyan az ebben a lekérdezésben látható:
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";
/child::PD:ProductDescription/child::PD:Features/child::*:Maintenance
')
FROM Production.ProductModel
WHERE ProductModelID=19
Ez a lekérdezés a termékkatalógus XML-dokumentumának összes névterében visszaadja az <Maintenance> elemcsomópont gyermekeit.
C. Csomóponttípus megadása a csomóponttesztben
Az alábbi példa a csomóponttípust adja meg csomóponttesztként az összes elérésiút-kifejezésben. Ennek eredményeként az összes kifejezés a csomóponttesztben megadott típusú csomópontokat adja vissza.
Az alábbi lekérdezésben az elérési út kifejezése a csomóponttípust adja meg a harmadik lépésben:
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";
/child::PD:ProductDescription/child::PD:Features/child::text()
')
FROM Production.ProductModel
WHERE ProductModelID=19
A következő lekérdezésben a következő van megadva:
Az elérésiút-kifejezés három lépést tartalmaz perjellel (
/) elválasztva.Mindegyik lépés egy gyermektengelyt jelöl meg.
Az első két lépés a csomópont nevét adja meg csomóponttesztként, a harmadik lépés pedig egy csomóponttípust határoz meg csomóponttesztként.
A kifejezés a <
ProductDescription> elemcsomópont <Features> elem gyermekének szövegcsomópont-gyermekeit adja vissza.
A rendszer csak egy szöveges csomópontot ad vissza. Ez az eredmény:
These are the product highlights.
Az alábbi lekérdezés a <ProductDescription> elem megjegyzéscsomó gyermekeit adja vissza:
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";
/child::PD:ProductDescription/child::comment()
')
FROM Production.ProductModel
WHERE ProductModelID=19
Jegyezze fel az előző lekérdezésben szereplő következőket:
A második lépés egy csomóponttípust határoz meg csomóponttesztként.
Ennek eredményeként a kifejezés a <
ProductDescription> elemcsomópontok megjegyzéscsomópontjait adja vissza.
Ez az eredmény:
<!-- add one or more of these elements... one for each specific product in this product model -->
<!-- add any tags in <specifications> -->
A következő lekérdezés lekéri a legfelső szintű feldolgozási-utasítás csomópontokat:
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";
/child::processing-instruction()
')
FROM Production.ProductModel
WHERE ProductModelID=19
Ez az eredmény:
<?xml-stylesheet href="ProductDescription.xsl" type="text/xsl"?>
A sztringkonstans paramétert átadhatja a processing-instruction() csomóponttesztnek. Ebben az esetben a lekérdezés azokat a feldolgozási utasításokat adja vissza, amelyek név attribútumának értéke az argumentumban megadott karakterlánc.
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";
/child::processing-instruction("xml-stylesheet")
')
FROM Production.ProductModel
WHERE ProductModelID=19
Megvalósítási korlátozások
Az alábbiakban a konkrét korlátozásokat ismertetjük
A kiterjesztett SequenceType csomóponttesztek nem támogatottak.
A feldolgozási utasítás(név) nem támogatott. Ehelyett tegye a nevet idézőjelek közé.