Поделиться через


SET ARITHABORT (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure конечной точке аналитики платформы Аналитики Azure Synapse Analytics (PDW) в 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

Замечания

В сеансах входа в систему всегда необходимо устанавливать для параметра 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 отключены, а одна из этих ошибок возникает, появится предупреждение, а результатом арифметической операции является NULL.

Примечание.

Если ни SET ARITHABORT, ни SET ARITHIGNORE не является ON, SQL Server возвращается NULL , а после выполнения запроса появится предупреждение.

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

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

Если любой из параметров 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 OFF не поддерживается в выделенных пулах SQL Azure Synapse Analytics.

Чтобы просмотреть текущее значение параметра 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