Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Применимо к:SQL Server
База данных Azure SQL
Управляемый экземпляр Azure SQL
Azure 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_WARNINGS — ON (по умолчанию), настройка не 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 настройках.
- Скрипт создаёт таблицы
t1выборок иt2вставляет значения выборочных данных. - Установите
ANSI_WARNINGS ONи запустите тесты, чтобы увидеть стандартное поведение ошибки деления на ноль и арифметического переполнения. - Настройте
ANSI_WARNINGS OFFтак, чтобы этоARITHABORTимело эффект, и установитеARITHABORT ON. Проведите тесты, чтобы увидеть поведение с ошибкой делением на ноль и арифметическим переполнением. - Установить обе
ANSI_WARNINGS OFFиARITHABORT OFF. Проведите тесты, чтобы увидеть поведение с ошибкой делением на ноль и арифметическим переполнением. - Убери таблицы образцов.
-- 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