SET ARITHABORT (Transact-SQL)

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Управляемый экземпляр SQL Azure Конечная точка аналитики аналитики Synapse Analytics Analytics (PDW)SQL Analyticsв Microsoft FabricХранилище в Microsoft Fabric

Завершает запрос, если во время выполнения запроса возникает ошибка переполнения или деления на ноль.

Соглашения о синтаксисе Transact-SQL

Синтаксис

Синтаксис для SQL Server, бессерверный пул SQL в Azure Synapse Analytics, Microsoft Fabric

SET ARITHABORT { ON | OFF }

Синтаксис для Системы платформы Azure Synapse Analytics и Analytics (PDW)

SET ARITHABORT ON

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Замечания

В сеансах входа в систему всегда необходимо устанавливать для параметра 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 не установлено значение ON, SQL Server возвращает значение NULL и после выполнения запроса появляется предупреждающее сообщение.

Если ANSI_WARNINGS имеет значение ON, а уровень совместимости базы данных установлен как 90 или выше, ARITHABORT неявно настраивается как ON вне зависимости от значения параметра. Если уровень совместимости базы данных установлен в состояние 80 или более раннее, то параметр ARITHABORT необходимо явным образом установить в состояние ON.

Если для вычисления выражения для параметра SET ARITHABORT установлено значение OFF, а в инструкциях INSERT, UPDATE или DELETE происходит арифметическая ошибка, ошибка переполнения, деления на ноль или ошибка домена, 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 происходит во время выполнения, но не во время синтаксического анализа.

Чтобы просмотреть текущее значение параметра SET ARITHABORT, выполните следующий запрос:

DECLARE @ARITHABORT VARCHAR(3) = 'OFF';  
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON';  
SELECT @ARITHABORT AS 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  

См. также

Инструкции SET (Transact-SQL)
SET ARITHIGNORE (Transact-SQL)
SESSIONPROPERTY (Transact-SQL)