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
A témakörben leírtaknak megfelelően az XQuery elérésiút-kifejezései, az elérésiút-kifejezések tengelylépései a következő összetevőket tartalmazzák:
Csomópontteszt. További információ: Csomópontteszt megadása elérésiút-kifejezés lépésben.
Nulla vagy több predikátum. Ez nem kötelező.
Az opcionális predikátum a tengelylépés harmadik része egy elérésiút-kifejezésben.
Predikátumok
Egy predikátum egy csomópontütemezés szűrésére szolgál egy megadott teszt alkalmazásával. A predikátum kifejezés szögletes zárójelben van, és az elérési út kifejezésének utolsó csomópontjára van kötve.
Tegyük fel például, hogy az XML-adattípushoz tartozó SQL-paraméter értéke (x) deklarálva van, ahogyan az a következő ábrán látható:
declare @x xml
set @x = '
<People>
<Person>
<Name>John</Name>
<Age>24</Age>
</Person>
<Person>
<Name>Goofy</Name>
<Age>54</Age>
</Person>
<Person>
<Name>Daffy</Name>
<Age>30</Age>
</Person>
</People>
'
Ebben az esetben a következők olyan érvényes kifejezések, amelyek három különböző csomópontszinten [1] predikátumértéket használnak:
select @x.query('/People/Person/Name[1]')
select @x.query('/People/Person[1]/Name')
select @x.query('/People[1]/Person/Name')
Vegye figyelembe, hogy a predikátum minden esetben a csomóponthoz kötődik abban az elérésiút-kifejezésben, ahol az alkalmazásra kerül. Az első elérési út kifejezés például kiválasztja az első <Name> elemet az egyes /People/Person csomópontokon belül, és a megadott XML-példánnyal a következőket adja vissza:
<Name>John</Name><Name>Goofy</Name><Name>Daffy</Name>
A második elérési út kifejezés azonban kijelöli az első /Személyek/Személy csomópont alatt lévő összes <Name> elemet. Ezért a következőket adja vissza:
<Name>John</Name>
A zárójelek a predikátum kiértékelési sorrendjének módosítására is használhatók. A következő kifejezésben például zárójelek halmaza választja el a (/Személyek/Személyek/Név) elérési útját a predikátumtól [1]:
select @x.query('(/People/Person/Name)[1]')
Ebben a példában a predikátum alkalmazásának sorrendje módosul. Ennek az az oka, hogy a zárt elérési utat először kiértékeli a rendszer (/Személyek/Személyek/Személy/Név), majd az [1] predikátum operátort alkalmazza a rendszer az összes olyan csomópontot tartalmazó készletre, amely megfelel a zárt elérési útnak. A zárójelek nélkül a művelet sorrendje abban különbözne, hogy az [1] csomóponttesztként child::Name lesz alkalmazva, hasonlóan az első elérésiút-kifejezés példájához.
Kvantitátorok és predikátumok
A kvantátorok a predikátum kapcsos zárójelei között több alkalommal is használhatók és hozzáadhatók. Az előző példában például a következő egynél több kvantáló érvényes használata egy összetett predikátum alexpresszión belül.
select @x.query('/People/Person[contains(Name[1], "J") and xs:integer(Age[1]) < 40]/Name/text()')
A predikátumkifejezés eredménye logikai értékké alakul, és predikátum-igazságértéknek nevezzük. Az eredményben csak azok a csomópontok lesznek visszaadva, amelyeknél a predikátum igazságértéke igaz. A rendszer minden más csomópontot elvet.
A következő elérésiút-kifejezés például tartalmaz egy predikátumot a második lépésben:
/child::root/child::Location[attribute::LocationID=10]
A predikátum által megadott feltétel az összes <Location> elemcsomópont-gyermekre vonatkozik. Az eredmény az, hogy a rendszer csak azokat a műhelyhelyeket adja vissza, amelyek LocationID attribútumértéke 10.
Az előző elérési út kifejezése a következő SELECT utasításban lesz végrehajtva:
SELECT Instructions.query('
declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
/child::AWMI:root/child::AWMI:Location[attribute::LocationID=10]
')
FROM Production.ProductModel
WHERE ProductModelID=7
Számítástechnikai predikátum igazságértékek
A predikátum igazságértékének meghatározásához a következő szabályokat kell alkalmazni az XQuery specifikációinak megfelelően:
Ha a predikátum kifejezés értéke üres sorozat, a predikátum igazságértéke Hamis.
Például:
SELECT Instructions.query(' declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"; /child::AWMI:root/child::AWMI:Location[attribute::LotSize] ') FROM Production.ProductModel WHERE ProductModelID=7A lekérdezés elérési útjának kifejezése csak azokat az <
Location> elemcsomópontokat adja vissza, amelyekhez LotSize attribútum van megadva. Ha a predikátum üres sorozatot ad vissza egy adotthoz <Location>, akkor az adott műhely helye nem lesz visszaadva az eredményben.A predikátumértékek csak xs:egész szám, xs:logikai vagy csomópont*lehetnek. Csomópont*esetén a predikátum igaz értéket ad vissza, ha vannak csomópontok, és hamis értéket egy üres sorozathoz. Bármely más numerikus típus, például kettős és lebegőpontos típus statikus gépelési hibát okoz. Egy kifejezés predikátum-igazságértéke Igaz, ha és csak akkor, ha az eredményül kapott egész szám megegyezik a környezeti pozíció értékével. Emellett csak az egész szám konstans értékei és az utolsó() függvény csökkenti a szűrt lépéskifejezés számosságát 1-re.
Az alábbi lekérdezés például lekéri az elem harmadik gyermekelem-csomópontját <
Features> .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::*[3] ') FROM Production.ProductModel WHERE ProductModelID=19Jegyezze fel az előző lekérdezésben szereplő következőket:
A kifejezés harmadik lépése egy predikátumkifejezést határoz meg, amelynek értéke 3. Ezért a kifejezés predikátum-igazságértéke csak azokra a csomópontokra igaz, amelyek környezeti helyzete 3.
A harmadik lépés egy helyettesítő karaktert (*) is megad, amely a csomópontteszt összes csomópontját jelzi. A predikátum azonban szűri a csomópontokat, és csak a harmadik pozícióban lévő csomópontot adja vissza.
A lekérdezés a dokumentumgyökér gyermekelemei elem gyermekeinek harmadik gyermekelem-csomópontját <
Features> adja vissza.<ProductDescription>
Ha a predikátumkifejezés értéke egy logikai típusú egyszerű típusérték, a predikátum igazságértéke megegyezik a predikátumkifejezés értékével.
A következő lekérdezés például egy XML-példányt tartalmazó XML-típusváltozón , az ügyfél felmérési XML-példányán van megadva. A lekérdezés lekéri azokat az ügyfeleket, akiknek gyermekük van. Ebben a lekérdezésben ez a HasChildren<1>/HasChildren< lesz>.
declare @x xml set @x=' <Survey> <Customer CustomerID="1" > <Age>27</Age> <Income>20000</Income> <HasChildren>1</HasChildren> </Customer> <Customer CustomerID="2" > <Age>27</Age> <Income>20000</Income> <HasChildren>0</HasChildren> </Customer> </Survey> ' declare @y xml set @y = @x.query(' for $c in /child::Survey/child::Customer[( child::HasChildren[1] cast as xs:boolean ? )] return <CustomerWithChildren> { $c/attribute::CustomerID } </CustomerWithChildren> ') select @yJegyezze fel az előző lekérdezésben szereplő következőket:
A ciklus kifejezésének két lépése van, a második lépés pedig egy predikátumot határoz meg. Ennek a predikátumnak az értéke logikai típusú érték. Ha ez az érték Igaz, akkor a predikátum igazságértéke is Igaz.
A lekérdezés visszaadja a <
Customer> dokumentumgyökerű Felmérés< elem gyermekeinek gyermekeit, akiknek a predikátumértéke Igaz>. Ez az eredmény:<CustomerWithChildren CustomerID="1"/>
Ha a predikátumkifejezés értéke olyan sorozat, amely legalább egy csomópontot tartalmaz, a predikátum igazságértéke Igaz.
Az alábbi lekérdezés például lekéri a ProductModelID azonosítót azokhoz a termékmodellekhez, amelyek XML-katalógusának leírása tartalmaz legalább egy funkciót, az <Features> elem gyermekelemét a wm előtaggal társított névtérből.
SELECT ProductModelID
FROM Production.ProductModel
WHERE CatalogDescription.exist('
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[wm:*]
') = 1
Jegyezze fel az előző lekérdezésben szereplő következőket:
A WHERE záradék a exist() metódust (XML-adattípust) adja meg.
A exist() metódusban található elérésiút-kifejezés egy predikátumot határoz meg a második lépésben. Ha a predikátum kifejezés legalább egy jellemző sorozatát adja vissza, ennek a predikátumkifejezésnek az igazságértéke Igaz. Ebben az esetben, mivel a exist() metódus true értéket ad vissza, a ProductModelID lesz visszaadva.
Statikus gépelési és predikátumszűrők
A predikátumok hatással lehetnek a kifejezés statikusan kikövetkeztetett típusára is. Az egész szám konstans értékei és az utolsó() függvény legfeljebb egyre csökkenti a szűrt lépéskifejezés számosságát.