SET SET ARITHABORT (Transact-SQL)

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

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

  • Когда вы устанавливаете SET ARITHABORT ON и SET ANSI_WARNINGS OFF, арифметические ошибки приводят к завершению партии. Если при исполнении транзакции произошли ошибки, то для этой транзакции выполняется откат.

  • Если оба SET ARITHABORT и SET ANSI_WARNINGS являются OFF и возникают арифметическая ошибка, появляется предупреждающее сообщение (если SET ARITHIGNORE только не ) ONи результатом арифметической операции становится NULL.

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

Синтаксис

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


SET ARITHABORT { ON | OFF }

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


SET ARITHABORT ON

Замечания

Когда ANSI_WARNINGSON (по умолчанию), настройка не ARITHABORT имеет функционального эффекта. Арифметические ошибки приводят к завершению запроса, но партия не прерывается (пока настройка XACT_ABORT ).OFF Арифметические ошибки включают ошибки переполнения, деление на ноль или ошибки области области.

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

Настройка по умолчанию ARITHABORT для SQL Server Management Studio (SSMS) — ON, тогда как клиентское соединение в приложении по умолчанию — ARITHABORT OFF. Даже если функциональной разницы нет, ANSI_WARNINGS пока это ONесть, ARITHABORT настройка всё равно остаётся ключом кэша. Таким образом, SSMS и приложение, использующее свои стандартные настройки, имеют разные записи кэша и могут иметь разные планы запросов, что затрудняет устранение плохо работающих запросов. То есть тот же запрос может выполняться медленнее в приложении, чем в SSMS. При устранении неполадок в Management Studio всегда подбирай настройки клиента ARITHABORT .

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

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

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

Разрешения

Необходимо быть членом роли public.

Просмотр текущей настройки ARITHABORT

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

DECLARE @ARITHABORT VARCHAR(3) = 'OFF';  
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON';  
SELECT @ARITHABORT AS ARITHABORT;  

Примеры

Следующий пример демонстрирует ошибки деления на ноль и переполнения при различных SET ARITHABORT настройках.

  1. Скрипт создаёт таблицы t1 выборок и t2 вставляет значения выборочных данных.
  2. Установите ANSI_WARNINGS ON и запустите тесты, чтобы увидеть стандартное поведение ошибки деления на ноль и арифметического переполнения.
  3. Настройте ANSI_WARNINGS OFF так, чтобы это ARITHABORT имело эффект, и установите ARITHABORT ON. Проведите тесты, чтобы увидеть поведение с ошибкой делением на ноль и арифметическим переполнением.
  4. Установить обе ANSI_WARNINGS OFF и ARITHABORT OFF. Проведите тесты, чтобы увидеть поведение с ошибкой делением на ноль и арифметическим переполнением.
  5. Убери таблицы образцов.
-- SET ARITHABORT  
-------------------------------------------------------------------------------  
-- Create tables t1 and t2 and insert data values.  
CREATE TABLE t1 (  
   a TINYINT,   
   b TINYINT  
);  
CREATE TABLE t2 (  
   a TINYINT NOT NULL  
);  
GO  
INSERT INTO t1   
VALUES (1, 0);  
INSERT INTO t1   
VALUES (255, 1);  
GO  

-- First run with ANSI_WARNINGS ON to see the default behavior.
PRINT '*** SET ANSI_WARNINGS ON';  
SET ANSI_WARNINGS ON;
SET XACT_ABORT OFF;    -- To make sure that we have the default setting for this option.  
GO
PRINT '*** Testing divide-by-zero during SELECT';  
GO  
SELECT a / b AS ab   
FROM t1;  
PRINT 'This prints, despite the error message.';
GO  

PRINT '*** Testing divide-by-zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
PRINT 'This prints, despite the error message.';
GO  

PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
PRINT 'This prints, despite the error message.';
GO  

PRINT '*** Resulting data - should be no data';  
GO  
SELECT *   
FROM t2;  
GO  

-- Truncate table t2.  
TRUNCATE TABLE t2;  
GO  

-- Set ANSI_WARNINGS OFF so that ARITHABORT has effect, and set ARITHABORT ON.
PRINT '*** SET ANSI_WARNINGS OFF; SET ARITHABORT ON';  
GO  
SET ANSI_WARNINGS OFF; 
SET ARITHABORT ON;  
GO  

PRINT '*** Testing divide-by-zero during SELECT';  
GO  
SELECT a / b AS ab    
FROM t1;  
PRINT 'This does not print.';
GO  

PRINT '*** Testing divide-by-zero during INSERT';  
GO  
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
PRINT 'This does not print.';
GO  
PRINT '*** Testing tinyint overflow';  
GO  
INSERT INTO t2  
SELECT a + b AS ab   
FROM t1;  
PRINT 'This does not print.';
GO  

PRINT '*** Resulting data - should be 0 rows';  
GO  
SELECT *   
FROM t2;  
GO  

-- Truncate table t2.  
TRUNCATE TABLE t2;  
GO  

-- Set both ANSI_WARNINGS OFF and ARITHABORT OFF.
PRINT '*** SET ARITHABORT OFF';  
GO  
SET ARITHABORT OFF;  
GO  

PRINT '*** Testing divide-by-zero during SELECT';  
GO  
-- Returns NULL.
SELECT a / b AS ab    
FROM t1;  
GO  

PRINT '*** Testing divide-by-zero during INSERT';  
GO  
-- Fails with NOT NULL violation.
INSERT INTO t2  
SELECT a / b AS ab    
FROM t1;  
GO  
PRINT '*** Testing tinyint overflow';  
GO  
-- Fails with NOT NULL violation
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 and restore ANSI_WARNINGS
DROP TABLE t1;  
DROP TABLE t2;  
SET ANSI_WARNINGS ON
GO