Zpracování chyb (XQuery)
platí pro:SQL Server
Specifikace W3C umožňuje statické nebo dynamické vyvolání chyb typů a definování statických, dynamických a typových chyb.
Kompilace a zpracování chyb
Chyby kompilace se vrací ze syntakticky nesprávných výrazů Xquery a příkazů XML DML. Fáze kompilace kontroluje správnost statického typu výrazů XQuery a příkazů DML a používá schémata XML pro odvození typů pro typ XML. Vyvolá chyby statického typu, pokud výraz může v době běhu selhat kvůli narušení bezpečnosti typu. Příkladem statické chyby je přidání řetězce do celého čísla a dotazování na neexistující uzel pro zadaná data.
Jako odchylka od standardu W3C se chyby za běhu XQuery převedou na prázdné sekvence. V závislosti na kontextu vyvolání se tyto sekvence můžou do výsledku dotazu rozšířit jako prázdný KÓD XML nebo NULL.
Explicitní přetypování na správný typ umožňuje uživatelům pracovat se statickými chybami, i když chyby přetypování za běhu budou transformovány na prázdné sekvence.
Statické chyby
Statické chyby se vrací pomocí mechanismu chyb Transact-SQL. V SQL Serveru se chyby typu XQuery vrací staticky. Další informace naleznete v tématu XQuery a statické psaní.
Dynamické chyby
V XQuery se většina dynamických chyb mapuje na prázdnou sekvenci ("()"). Jedná se však o dvě výjimky: podmínky přetečení ve funkcích agregátoru XQuery a XML-DML chyby ověřování. Všimněte si, že většina dynamických chyb se mapuje na prázdnou sekvenci. V opačném případě může provádění dotazu, které využívá výhod indexů XML, vyvolat neočekávané chyby. Proto, aby bylo možné zajistit efektivní provádění bez generování neočekávaných chyb, databázový stroj SQL Serveru mapuje dynamické chyby na ().
V situaci, kdy se dynamická chyba vyskytuje v predikátu, se často nemění sémantika, protože () je mapována na False. V některých případech ale může vrácení () místo dynamické chyby způsobit neočekávané výsledky. Tady jsou příklady, které to ilustrují.
Příklad: Použití funkce avg() s řetězcem
V následujícím příkladu se volá avg function k výpočtu průměru tří hodnot. Jednou z těchto hodnot je řetězec. Vzhledem k tomu, že instance XML v tomto případě není zadána, všechna data v ní jsou netypového atomového typu. Funkce avg() nejprve přetypuje tyto hodnoty na xs:double před výpočtem průměru. Hodnotu "Hello"
však nelze přetypovat na xs:double a vytvoří dynamickou chybu. V tomto případě místo vrácení dynamické chyby přetypování "Hello"
na xs:double způsobí prázdnou sekvenci. Funkce avg() tuto hodnotu ignoruje, vypočítá průměr ostatních dvou hodnot a vrátí hodnotu 150.
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říklad: Použití funkce not
Pokud použijete funkci v predikátu, například /SomeNode[not(Expression)]
a výraz způsobí dynamickou chybu, místo chyby se vrátí prázdná sekvence. Použití not() na prázdnou sekvenci vrátí hodnotu True místo chyby.
Příklad: Přetypování řetězce
V následujícím příkladu se literálový řetězec "NaN" přetypuje na xs:string a pak na xs:double. Výsledkem je prázdná sada řádků. Ačkoli řetězec "NaN" nelze úspěšně přetypovat na xs:double, nelze to určit, dokud modul runtime, protože řetězec je nejprve přetypován na xs:string.
DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double(xs:string("NaN")) ')
GO
V tomto příkladu však dojde k chybě statického typu.
DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double("NaN") ')
GO
Omezení implementace
Funkce fn:error() není podporována.
Viz také
jazyka XQuery (SQL Server)
základy XQuery