SET ARITHABORT (Transact-SQL)
Завершает запрос, если во время его выполнения возникает ошибка переполнения или деления на ноль.
Синтаксис
SET ARITHABORT { ON | OFF }
[ ; ]
Замечания
Если параметры SET ARITHABORT и SET ANSI WARNINGS установлены в значение ON, эти условия ошибок приведут к завершению запроса. Если параметр SET ARITHABORT установлен в значение ON, а параметр SET ANSI WARNINGS установлен в значение OFF, то эти условия ошибок приведут к завершению пакета. Если при исполнении транзакции произошли ошибки, то для этой транзакции выполняется откат. Если параметр SET ARITHABORT установлен в значение 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 для индексированных представлений и индексов на вычисляемых столбцах см. в разделе Параметры SET, влияющие на результаты.
Установка параметра 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
См. также