Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Область применения:SQL Server
Спецификация W3C позволяет стирать ошибки типа данных статически или динамически и определяет статические, динамические ошибки и ошибки типа данных.
Компиляция и обработка ошибок
Ошибки компиляции возвращаются из синтаксически неправильных выражений и XML DML инструкций Xquery. На этапе компиляции проверяется правильность выражений XQuery и DML-инструкций в контексте статических типов и используются XML-схемы для вывода типов типизированного XML. Если выражение может завершиться неудачей в период выполнения из-за нарушения безопасности типов, компилятор формирует ошибки статических типов. Примерами статических ошибок являются добавление строки к целому числу и запрос несуществующего узла типизированных данных.
Ошибки XQuery периода выполнения преобразуются в пустые последовательности — это отклонение от стандарта W3C. Эти последовательности могут распространяться как пустой XML или NULL в результат запроса в зависимости от контекста вызова.
Явное приведение к правильному типу позволяет предотвращать статические ошибки, хотя ошибки приведения типов в период выполнения будут преобразовываться в пустые последовательности.
Замечание
Синтаксический анализ ошибок, вызванных средством синтаксического анализа XQuery (например, синтаксической ошибкой в XML- методе типа данных XML), прерывает активную транзакцию независимо от XACT_ABORT параметра текущего сеанса.
Статические ошибки
Статические ошибки возвращаются с помощью механизма ошибок 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
При использовании функции 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() не поддерживается.