SET SET ARITHABORT (Transact-SQL)

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

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

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

Синтаксис

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

SET ARITHABORT { ON | OFF }

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

SET ARITHABORT ON

Замечания

Всегда ставьте ARITHABORT ВКЛЮЧЕНО в сессиях входа. Установка ARITHABORT OFF может негативно повлиять на оптимизацию запросов, что приводит к проблемам с производительностью.

Предупреждение

Настройка по умолчанию ARITHABORT для SQL Server Management Studio — ВКЛЮЧЕНО. Клиентские приложения, настроенные ARITHABORT на OFF, могут получать разные планы запросов, что затрудняет устранение плохо работающих запросов. Иными словами, один и тот же запрос может выполняться быстро в среде Management Studio, но медленно в приложении. При устранении неполадок в Management Studio всегда подбирай настройки клиента ARITHABORT .

Когда SET ARITHABORT и SET ANSI WARNINGS включены, эти ошибки приводят к завершению запроса.

Когда SET ARITHABORT включено и SET ANSI WARNINGS ВЫКЛЮЧЕНО, эти ошибки приводят к завершению пакета. Если при исполнении транзакции произошли ошибки, то для этой транзакции выполняется откат. Когда SETSET ARITHABORT ВЫКЛЮЧЕНА и возникает одна из этих ошибок, появляется предупреждающее сообщение, и результатом арифметической операции становится NULL.

Если SET ARITHABORT и SET ANSI WARNINGS OFF и возникает одна из этих ошибок, появляется предупреждающее сообщение, и результатом арифметической операции становится NULL.

Примечание.

Если ни SET ARITHABORTSETSET ARITHIGNORE ни НИ не включены, SQL Server возвращаетсяNULL, и после запуска запроса появляется предупреждающее сообщение.

Когда ANSI_WARNINGS имеет значение ON, а уровень совместимости базы данных установлен на 90 или выше, то ARITHABORT неявно ВКЛЮЧЕНО независимо от настройки значения. Если уровень совместимости базы данных установлен на 80 или раньше, опция ARITHABORT должна быть явно установлена в ВКЛЮЧЕНО.

Для оценки выражения, если SET ARITHABORT это OFF, а INSERTоператор , UPDATE, или DELETE встречает арифметику, переполнение, деление на ноль или ошибку домена, SQL Server вставляет или обновляет значениеNULL. Если целевой столбец не пустой, вставка или обновление не осуществляются и пользователь получает ошибку.

Когда один SET ARITHABORT из SETSET ARITHIGNORE вариантов выключен и SETSET ANSI_WARNINGS включен, SQL Server всё равно возвращает сообщение об ошибке при обнаружении ошибок деления на ноль или переполнения.

Когда SETSET ARITHABORT OFF и при оценке булевого условия оператора IF возникает ошибка прекращения, выполняется ветка FALSE.

SET SET ARITHABORT При создании или изменении индексов на вычисленных столбцах или индексных представлениях должно быть ВКЛЮЧЕНО. Если SET ARITHABORT OFF, CREATE, UPDATE, INSERT, и DELETE операторы в таблицах с индексами в вычисленных столбцах или индексированных представлениях не работают.

Настройка SETSET ARITHABORT происходит во время выполнения или выполнения, а не во время разбора.

SET SET ARITHABORTOFF не поддерживается в выделенных SQL-пулах Azure Synapse Analytics.

Чтобы просмотреть текущую настановку для SETSET 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