Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Применимо к: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