Обработка ошибок (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() не поддерживается.