Hibakezelés (XQuery)

A következőkre vonatkozik:SQL Server

A W3C-specifikáció lehetővé teszi, hogy a típushibák statikusan vagy dinamikusan legyenek előállítva, és statikus, dinamikus és típushibákat határoznak meg.

Fordítás és hibakezelés

A fordítási hibákat a rendszer szintaktikailag helytelen Xquery-kifejezésekből és XML DML utasításokból adja vissza. A fordítási fázis ellenőrzi az XQuery-kifejezések és DML-utasítások statikus típus-helyességét, és XML-sémákat használ a gépelt XML típuskövetkezményeihez. Statikus típushibákat okoz, ha egy kifejezés futásidőben meghiúsulhat egy típusbiztonsági szabálysértés miatt. Statikus hiba például egy sztring egész számhoz való hozzáadása és a beírt adatok nem létező csomópontjának lekérdezése.

A W3C szabványtól való eltérésként az XQuery futásidejű hibái üres sorozatokká alakulnak. Ezek a sorozatok a meghívási környezettől függően üres XML-fájlként vagy NULL lekérdezési eredményként propagálódhatnak.

A helyes típusra történő explicit öntés lehetővé teszi a felhasználók számára a statikus hibák megkerülésére, bár a futásidejű leadási hibák üres sorozatokká alakulnak át.

Megjegyzés:

Az XQuery parszer által felmerült elemzési hibák (például az XML adattípus módszer részeként hivatkozott XML-ben megjelenő szintaxishiba) megszakítják az aktív tranzakciót, függetlenül a XACT_ABORT jelenlegi ülés beállításától.

Statikus hibák

A statikus hibákat a rendszer a Transact-SQL hibamechanizmus használatával adja vissza. Az SQL Server xQuery típusú hibái statikusan jelennek meg. További információ: XQuery és Static Typing.

Dinamikus hibák

Az XQueryben a legtöbb dinamikus hiba egy üres sorozatra ("()") van leképezve. Ez azonban a két kivétel: az XQuery-összesítő függvények túlcsordulási feltételei és XML-DML érvényesítési hibák. A legtöbb dinamikus hiba üres sorozatra van leképezve. Ellenkező esetben az XML-indexek előnyeit kihasználó lekérdezés-végrehajtás váratlan hibákat eredményezhet. Ezért, hogy hatékony végrehajtást biztosítson váratlan hibák generálása nélkül, az SQL Server adatbázismotor a dinamikus hibákat a () értékre képezi le.

Gyakran előfordul, hogy abban a helyzetben, amikor a dinamikus hiba egy predikátumban fordul elő, a hiba nem emelése nem módosítja a szemantikát, mert () hamisra van leképezve. Bizonyos esetekben azonban a dinamikus hiba helyett a visszatérés () váratlan eredményeket okozhat. Az alábbi példák ezt szemléltetik.

Példa: Az avg() függvény használata sztringgel

A következő példában az Avg függvény a három érték átlagának kiszámítására van meghívva. Az értékek egyike egy sztring. Mivel ebben az esetben az XML-példány nincs begépelve, a benne lévő összes adat nem íratlan atomtípusú. Az avg() függvény először xs:double értékre öntötte ezeket az értékeket, mielőtt kiszámítja az átlagot. Az érték "Hello"azonban nem vethető xs:double értékre, és dinamikus hibát okoz. Ebben az esetben ahelyett, hogy dinamikus hibát ad vissza, az "Hello" értékre történő kiosztás üres sorozatot okoz. Az avg() függvény figyelmen kívül hagyja ezt az értéket, kiszámítja a másik két érték átlagát, és 150 értéket ad vissza.

DECLARE @x xml
SET @x=N'<root xmlns:myNS="test">
 <a>100</a>
 <b>200</b>
 <c>Hello</c>
</root>'
SELECT @x.query('avg(//*)')

Példa: A nem függvény használata

Ha például a Not függvényt használja egy predikátumban, /SomeNode[not(Expression)]és a kifejezés dinamikus hibát okoz, a rendszer hiba helyett üres sorozatot ad vissza. Ha a not() függvényt az üres sorozatra alkalmazza, az igaz értéket adja vissza hiba helyett.

Példa: Sztring kiosztása

A következő példában a "NaN" literális sztring xs:string, majd xs:double értékre lesz öntött. Az eredmény egy üres sorkészlet. Bár a "NaN" sztringet nem lehet sikeresen xs:double értékre leadni, ez futásidőben nem határozható meg, mert a sztringet először xs:stringre öntötték.

DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double(xs:string("NaN")) ')
GO

Ebben a példában azonban statikus típusú hiba történik.

DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double("NaN") ')
GO

Megvalósítási korlátozások

Az fn:error() függvény nem támogatott.