Поделиться через


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

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

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

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

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

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

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

Пример A

Обратите внимание на следующий запрос:

DECLARE @x xml
SET @x='<a>Hello</a>'
SELECT @x.query('xs:double(/a[1])')

Выражение xs:double(/a[1]) вызывает динамическую ошибку. Преобразование строки, которое возвращается функцией string() для удвоения, формирует динамическую ошибку во время выполнения. Вместо возвращения ошибки запрос возвращает пустую последовательность.

Пример Б

В следующем примере метод функция 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(//*)')

Пример В

Когда используется не функция в предикате, например /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

Другие ресурсы

Запрос XQuery к типу данных xml

Справка и поддержка

Получение помощи по SQL Server 2005