Freigeben über


Fehlerbehandlung (XQuery)

Gilt für:SQL Server

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. Daher ordnet SQL Server Datenbank-Engine dynamische Fehler zu () zu, um eine effiziente Ausführung ohne unerwartete Fehler zu ermöglichen.

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 aufgerufen, um den Durchschnitt der drei Werte zu berechnen. 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 Durchschnitt berechnet wird. Der Wert "Hello"kann jedoch nicht in xs:double umgewandelt werden und erzeugt einen dynamischen Fehler. In diesem Fall führt die Umwandlung von "Hello" zu xs:double zu einer leeren Sequenz, anstatt einen dynamischen Fehler zurückzugeben. Die avg() -Funktion ignoriert diesen Wert, berechnet den Durchschnitt der anderen beiden 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 einen dynamischen Fehler verursacht, wird anstelle eines Fehlers eine leere Sequenz zurückgegeben. Wenn not() auf die leere Sequenz angewendet wird, wird anstelle eines Fehlers True zurückgegeben.

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.

Weitere Informationen

XQuery-Sprachreferenz (SQL Server)
XQuery-Grundlagen