Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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
Kompilierungsfehler werden aus syntaktisch falschen Xquery-Ausdrücken und XML DML -Anweisungen 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 leeres XML oder NULL an das Abfrageergebnis weitergegeben werden.
Die explizite Umwandlung in den richtigen Typ ermöglicht Benutzern das Umgehen von statischen Fehlern, obwohl dabei Laufzeitumwandlungsfehler in leere Sequenzen transformiert werden.
Hinweis
Analysieren von Fehlern, die vom XQuery-Parser ausgelöst werden (z. B. Syntaxfehler in der XML-Datentypmethode, auf die als Teil der XML-Datentypmethode verwiesen wird), bricht die aktive Transaktion unabhängig von der XACT_ABORT Einstellung der aktuellen Sitzung ab.
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 Eingabe".
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. Die meisten dynamischen Fehler werden einer leeren Sequenz zugeordnet. Andernfalls kann die Abfrageausführung, die Vorteile der XML-Indizes nutzt, unerwartete Fehler auslösen. Um eine effiziente Ausführung bereitzustellen, ohne unerwartete Fehler zu generieren, ordnet SQL Server Datenbank-Engine dynamische Fehler zu ().
Häufig ändert sich in der Situation, in der der dynamische Fehler in einem Prädikat auftritt, nicht das Auslösen des Fehlers die Semantik, da () false zugeordnet ist. In einigen Fällen kann das Zurückgeben () anstelle 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 Mittelwert der drei Werte zu berechnen. Einer dieser Werte ist eine Zeichenfolge. Da die XML-Instanz in diesem Fall untypiert ist, sind alle Darin enthaltenen Daten von untypisiertem Atomtyp. 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 " umgestellt werden und erstellt einen dynamischen Fehler. In diesem Fall führt die Umwandlung von "Hello" " xs:double " anstelle eines dynamischen Fehlers zu einer leeren Sequenz. Die avg() -Funktion ignoriert diesen Wert, berechnet den Mittelwert 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 funktion nicht
Wenn Sie die Funktion Not in einem Prädikat verwenden, /SomeNode[not(Expression)]z. B. , und der Ausdruck verursacht einen dynamischen Fehler, wird eine leere Sequenz anstelle eines Fehlers zurückgegeben. Das Anwenden von "not()" auf die leere Sequenz gibt "True" anstelle 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. Obwohl die Zeichenfolge "NaN" nicht erfolgreich in "xs:double" umgestellt werden kann, kann dies erst bestimmt werden, wenn die Zeichenfolge zum ersten Mal in "xs:string" umgestellt 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 Funktion fn:error() wird nicht unterstützt.