Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Область применения: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() не поддерживается.