SET ARITHABORT (Transact-SQL)
Завершает запрос, если во время его выполнения возникает ошибка переполнения или деления на нуль.
Синтаксические обозначения в Transact-SQL
Синтаксис
SET ARITHABORT { ON | OFF }
[ ; ]
Замечания
В сеансах входа в систему всегда необходимо устанавливать параметр ARITHABORT в значение ON. Если для параметра ARITHABORT установлено значение OFF, это может отрицательно повлиять на оптимизацию запросов и привести к проблемам с производительностью.
Внимание! |
---|
Настройка по умолчанию ARITHABORT для SQL Server Management Studio — ON. Клиентские приложения с параметром ARITHABORT, установленным в значение OFF, могут получать разные планы запроса, что осложняет диагностику плохо выполняемых запросов. Иными словами, один и тот же запрос может выполняться быстро в среде Management Studio, но медленно в приложении. При диагностике запросов с Management Studio всегда сопоставляйте параметр ARITHABORT клиента. |
Если параметры SET ARITHABORT и SET ANSI WARNINGS установлены в значение ON, эти условия ошибок приведут к завершению запроса.
Если параметр SET ARITHABORT установлен в значение ON, а параметр SET ANSI WARNINGS установлен в значение OFF, то эти условия ошибок приведут к завершению пакета. Если при исполнении транзакции произошли ошибки, то для этой транзакции выполняется откат. Если параметр SET ARITHABORT установлен в значение OFF и возникает одна из этих ошибок, то выводится предупреждающее сообщение, а результату арифметической операции присваивается значение NULL.
Если параметры SET ARITHABORT и SET ANSI WARNINGS имеют значение OFF и возникает одна из этих ошибок, отображается предупреждающее сообщение, а результат арифметической операции принимает значение NULL.
Примечание |
---|
Если ни один из параметров SET ARITHABORT и SET ARITHIGNORE не установлен, SQL Server возвращает значение NULL и предупреждающее сообщение после выполнения запроса. |
Присвоение параметру ANSI_WARNINGS значения ON неявно устанавливает параметр ARITHABORT в значение ON, если уровень совместимости базы данных равен 90. Если же он равен 80 или меньше, параметру ARITHABORT следует явно присвоить значение ON.
Во время вычисления выражения, когда параметр SET ARITHABORT установлен в значение OFF, если инструкции INSERT, DELETE или UPDATE встречают арифметическую ошибку переполнения, деления на ноль или ошибку области определения, SQL Server вставляет или обновляет значение NULL. Если целевой столбец не пустой, вставка или обновление не осуществляются, и пользователь получает ошибку.
Если значение параметров SET ARITHABORT и SET ARITHIGNORE установлено в OFF, а значение параметра SET ANSI_WARNINGS установлено в ON, SQL Server возвращает сообщение об ошибке при обнаружении ошибок деления на ноль и переполнения.
Если параметр SET ARITHABORT установлен в значение OFF и возникают аварийные ошибки во время вычисления логических условий в инструкции IF, то будет исполняться ветвь FALSE.
Значение параметра SET ARITHABORT должно быть ON, если создаются или изменяются индексы на вычисляемых столбцах или индексированных представлениях. Если значение параметра SET ARITHABORT установлено в OFF, то действия инструкций CREATE, UPDATE, INSERT и DELETE на таблицах с индексами на вычисляемых столбцах или на индексированных представлениях будут завершаться ошибкой.
Установка параметра SET ARITHABORT означает установку при запуске или во время выполнения, но не во время синтаксического анализа.
Разрешения
Требуется членство в роли public.
Примеры
Следующий пример демонстрирует ошибки деления на ноль и переполнения при обеих настройках параметра SET ARITHABORT.
-- SET ARITHABORT
-------------------------------------------------------------------------------
-- Create tables t1 and t2 and insert data values.
CREATE TABLE t1 (
a TINYINT,
b TINYINT
);
CREATE TABLE t2 (
a TINYINT
);
GO
INSERT INTO t1
VALUES (1, 0);
INSERT INTO t1
VALUES (255, 1);
GO
PRINT '*** SET ARITHABORT ON';
GO
-- SET ARITHABORT ON and testing.
SET ARITHABORT ON;
GO
PRINT '*** Testing divide by zero during SELECT';
GO
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing divide by zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab
FROM t1;
GO
PRINT '*** Resulting data - should be no data';
GO
SELECT *
FROM t2;
GO
-- Truncate table t2.
TRUNCATE TABLE t2;
GO
-- SET ARITHABORT OFF and testing.
PRINT '*** SET ARITHABORT OFF';
GO
SET ARITHABORT OFF;
GO
-- This works properly.
PRINT '*** Testing divide by zero during SELECT';
GO
SELECT a / b AS ab
FROM t1;
GO
-- This works as if SET ARITHABORT was ON.
PRINT '*** Testing divide by zero during INSERT';
GO
INSERT INTO t2
SELECT a / b AS ab
FROM t1;
GO
PRINT '*** Testing tinyint overflow';
GO
INSERT INTO t2
SELECT a + b AS ab
FROM t1;
GO
PRINT '*** Resulting data - should be 0 rows';
GO
SELECT *
FROM t2;
GO
-- Drop tables t1 and t2.
DROP TABLE t1;
DROP TABLE t2;
GO