Fehlerbehandlung (XQuery)
Gemäß der W3C-Spezifikation können Typfehler statisch oder dynamisch ausgelöst werden; die Spezifikation definiert statische, dynamische und Typfehler.
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 2005-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 A:
Betrachten Sie die folgende Abfrage:
DECLARE @x xml
SET @x='<a>Hello</a>'
SELECT @x.query('xs:double(/a[1])')
Der Ausdruck xs:double(/a[1]
) bewirkt einen dynamischen Fehler. Das Konvertieren der von der string()-Funktion zurückgegebenen Zeichenfolge zur Laufzeit in den double-Typ generiert einen dynamischen Fehler. Anstatt den Fehler zurückzugeben, gibt die Abfrage eine leere Sequenz zurück.
Beispiel B:
Im folgenden Beispiel wird die avg-funktion zum Berechnen des Mittelwertes 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 C:
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 D:
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.