Обработка ошибок (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 к типу данных xml