Обработка ошибок (XQuery)

Применимо к:SQL Server

Спецификация W3C позволяет стирать ошибки типа данных статически или динамически и определяет статические, динамические ошибки и ошибки типа данных.

Компиляция и обработка ошибок

При обработке синтаксически неверных выражений Xquery и инструкций XML DML возвращаются ошибки компиляции. На этапе компиляции проверяется правильность выражений XQuery и DML-инструкций в контексте статических типов и используются XML-схемы для вывода типов типизированного XML. Если выражение может завершиться неудачей в период выполнения из-за нарушения безопасности типов, компилятор формирует ошибки статических типов. Примерами статических ошибок являются добавление строки к целому числу и запрос несуществующего узла типизированных данных.

Ошибки XQuery периода выполнения преобразуются в пустые последовательности — это отклонение от стандарта W3C. В результате запроса эти последовательности могут быть представлены как пустой XML или как значение NULL, что зависит от контекста вызова.

Явное приведение к правильному типу позволяет предотвращать статические ошибки, хотя ошибки приведения типов в период выполнения будут преобразовываться в пустые последовательности.

Статические ошибки

Статические ошибки возвращаются с помощью механизма ошибок Transact-SQL. В SQL Server ошибки типа XQuery возвращаются статически. Дополнительные сведения см. в разделе "XQuery" и "Статический ввод".

Динамические ошибки

В языке XQuery большинство динамических ошибок сопоставляется с пустой последовательностью («()»). Однако это два исключения: условия переполнения в функциях агрегатора XQuery и ошибках проверки XML-DML. Обратите внимание, что большинство динамических ошибок сопоставляется с пустой последовательностью. В противном случае выполнение запроса, которое получает преимущества от XML-индексов, может возбудить непредвиденные ошибки. Таким образом, чтобы обеспечить эффективное выполнение без возникновения непредвиденных ошибок, ядро СУБД SQL Server сопоставляет динамические ошибки с ().

Часто в ситуации, когда динамическая ошибка возникнет внутри предиката, отсутствие сигнала об ошибке не меняет семантику, потому что () сопоставляется со значением False. Однако в некоторых случаях возврат () вместо динамической ошибки может вызвать непредвиденные результаты. Следующие примеры иллюстрируют данную ситуацию.

Пример. Использование функции avg() со строкой

В следующем примере функция avg вызывается для вычисления среднего значения трех значений. Одно из этих значений представляет собой строку. Поскольку в этом случае экземпляр XML не типизирован, все данные в нем принадлежат к нетипизированному элементарному типу. Функция avg() сначала приводит эти значения к xs:double перед вычислением среднего. Однако значение не "Hello"может быть приведение к xs:double и создает динамическую ошибку. В этом случае вместо возврата динамической ошибки приведение "Hello" к xs:double вызывает пустую последовательность. Функция avg() игнорирует это значение, вычисляет среднее значение других двух значений и возвращает 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(//*)')  

Пример. Использование функции not

Если вы используете не функцию в предикате, например, /SomeNode[not(Expression)]и выражение вызывает динамическую ошибку, пустая последовательность будет возвращена вместо ошибки. Применение not() к пустой последовательности возвращает значение True вместо ошибки.

Пример: приведение строки

В следующем примере строковая константа "NaN" приводится к типу данных xs:string, затем к xs:double. Результатом является пустой набор строк. Несмотря на то, что строка "NaN" не может успешно быть приведена к типу xs:double, это не может быть определено до момента выполнения, потому что сначала строка приводится к типу xs:string.

DECLARE @x XML  
SET @x = ''  
SELECT @x.query(' xs:double(xs:string("NaN")) ')  
GO  

Однако в данном примере статическая ошибка возникает.

DECLARE @x XML  
SET @x = ''  
SELECT @x.query(' xs:double("NaN") ')  
GO  

Ограничения реализации

Функция fn:error() не поддерживается.

См. также

Справочник по языку XQuery (SQL Server)
Основы XQuery