Fehlerbehandlung (XQuery)
Gemäß der W3C-Spezifikation können Typfehler statisch oder dynamisch ausgelöst werden; die Spezifikation definiert statische, dynamische und Typfehler.
Kompilierung und Fehlerbehandlung
Von syntaktisch fehlerhaften XQuery-Ausdrücken und XML DML-Anweisungen werden Kompilierungsfehler zurückgegeben. In der Kompilierungsphase wird die Richtigkeit des statischen Typs von XQuery-Ausdrücken und von DML-Anweisungen überprüft, und es werden XML-Schemas für Typrückschlüsse für typisiertes XML verwendet. Es werden statische Typfehler ausgelöst, wenn ein Ausdruck aufgrund eines Verstoßes gegen die Typsicherheit zur Laufzeit fehlschlagen könnte. Beispiele für statische Fehler sind das Hinzufügen einer Zeichenfolge zu einer ganzen Zahl und das Abfragen eines nicht vorhandenen Knotens für typisierte Daten.
In Abweichung vom W3C-Standard werden XQuery-Laufzeitfehler in leere Sequenzen umgewandelt. Diese Sequenzen können je nach Aufrufkontext als leere XML-Daten oder als NULL-Wert an das Abfrageergebnis übergeben werden.
Die explizite Umwandlung in den richtigen Typ ermöglicht Benutzern das Umgehen von statischen Fehlern, obwohl dabei Laufzeitumwandlungsfehler in leere Sequenzen transformiert werden.
Statische Fehler
Statische Fehler werden mithilfe des Transact-SQL-Fehlermechanismus zurückgegeben. In SQL Server werden XQuery-Typfehler statisch zurückgegeben. Weitere Informationen finden Sie unter XQuery und statische Typisierung.
Dynamische Fehler
In XQuery werden die meisten dynamischen Fehler einer leeren Sequenz ("()") zugeordnet. Dabei gelten die folgenden beiden Ausnahmen: Überlaufbedingungen in XQuery-Aggregatfunktionen und XML-DML-Überprüfungsfehler. Beachten Sie, dass die meisten dynamischen Fehler einer leeren Sequenz zugeordnet werden. Anderenfalls kann eine Abfrageausführung, die XML-Indizes nutzt, unerwartete Fehler auslösen. Um eine effiziente Ausführung zu ermöglichen, ohne dass unerwartete Fehler generiert werden, ordnet deshalb SQL Server Database Engine (Datenbankmodul) dynamische Fehler () zu.
Wenn ein dynamischer Fehler in einem Prädikat auftritt, bedeutet das Nichtauslösen des Fehlers, dass die Semantik nicht geändert wird, weil () False zugeordnet wird. In einigen Fällen kann die Rückgabe von () statt eines dynamischen Fehlers jedoch zu unerwarteten Ergebnissen führen. Die folgenden Beispiele veranschaulichen dies.
Beispiel: Verwenden der avg()-Funktion mit einer Zeichenfolge
Im folgenden Beispiel wird die avg-funktion zum Berechnen des Mittelwerts dreier Werte aufgerufen. Einer dieser Werte ist eine Zeichenfolge. Da die XML-Instanz in diesem Fall nicht typisiert ist, sind alle darin enthaltenen Daten nicht typisierte atomare Typen. Die avg()-Funktion wandelt diese Werte zuerst in xs:double um, bevor der Mittelwert berechnet wird. Der Wert "Hello" kann jedoch nicht in xs:double umgewandelt werden und erstellt einen dynamischen Fehler. In diesem Fall bewirkt das Umwandeln von "Hello" in xs:double eine leere Sequenz, anstatt einen dynamischen Fehler zurückzugeben. Die avg()-Funktion ignoriert diesen Wert, berechnet den Mittelwert der beiden anderen Werte und gibt 150 zurück.
DECLARE @x xml
SET @x=N'<root xmlns:myNS="test">
<a>100</a>
<b>200</b>
<c>Hello</c>
</root>'
SELECT @x.query('avg(//*)')
Beispiel: Verwenden der not-Funktion
Wenn Sie die not-Funktion in einem Prädikat verwenden (z. B. /SomeNode[not(Expression)]), und der Ausdruck bewirkt einen dynamischen Fehler, wird eine leere Sequenz statt eines Fehlers zurückgegeben. Das Anwenden von not() auf die leere Sequenz gibt True statt eines Fehlers zurück.
Beispiel: Umwandeln einer Zeichenfolge
Im folgenden Beispiel wird die Literalzeichenfolge "NaN" zuerst in xs:string und dann in xs:double umgewandelt. Das Ergebnis ist ein leeres Rowset. Die Zeichenfolge "NaN" kann nicht erfolgreich in xs:double umgewandelt werden; dies wird jedoch erst zur Laufzeit bestimmt, weil die Zeichenfolge zuerst in xs:string umgewandelt wird.
DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double(xs:string("NaN")) ')
GO
In diesem Beispiel tritt jedoch ein statischer Typfehler auf.
DECLARE @x XML
SET @x = ''
SELECT @x.query(' xs:double("NaN") ')
GO
Implementierungseinschränkungen
Die fn:error()-Funktion wird nicht unterstützt.