Megosztás:


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-elemző által kiváltott hibák elemzése (például az XML-adattípus metódus részeként hivatkozott XML szintaxishibái) megszakítják az aktív tranzakciót, függetlenül az aktuális munkamenet XACT_ABORT 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 xs:double értékre történő kiosztás "Hello" ü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.