적용 대상:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
분석 플랫폼 시스템(PDW)
Microsoft Fabric의 SQL 분석 엔드포인트
Microsoft Fabric의 웨어하우스
Microsoft Fabric의 SQL 데이터베이스
이 설정은 SET ARITHABORT 쿼리 실행 중 오버플로우 또는 제로 나누기 오류가 발생하면 쿼리가 중단되는지 결정합니다.
와
SET ANSI_WARNINGS OFF를 설정SET ARITHABORT ON하면 산술 오류가 발생해 배치가 종료됩니다. 트랜잭션에서 해당 오류가 발생하면 트랜잭션이 롤백됩니다.만약 와
SET ANSI_WARNINGS가 모두SET ARITHABORT존재OFF하고 산술 오류가 발생하면 경고 메시지가 나타나며(가 아닌ON한SET ARITHIGNORE) 산술 연산 결과는 입니다.NULL
구문
Syntax for SQL Server, 서버리스 SQL 풀 in Azure Synapse Analytics, Microsoft Fabric, SQL 데이터베이스 in Microsoft Fabric
SET ARITHABORT { ON | OFF }
Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW) 구문
SET ARITHABORT ON
설명
가 기본값 ON 일 때ANSI_WARNINGS, 의 ARITHABORT 설정은 기능적 영향을 미치지 않습니다. 산술 오류로 쿼리가 종료되지만, 배치는 (설정 XACT_ABORT 이 있는 OFF한 중재되지 않습니다).
경고
SQL Server Management Studio(SSMS)ON의 기본 ARITHABORT 설정은 이지만, 애플리케이션 내 클라이언트 연결은 기본값ARITHABORT OFF입니다. 기능적으로 차이 ANSI_WARNINGSON가 없더라도 설정 ARITHABORT 은 여전히 캐시 키입니다. 따라서 SSMS와 애플리케이션은 각각 기본값을 사용하므로 서로 다른 캐시 항목과 쿼리 계획을 가질 수 있어 성능이 좋지 않은 쿼리를 문제 해결하기 어렵습니다. 즉, 동일한 쿼리가 애플리케이션에서 SSMS보다 더 느리게 실행될 수 있습니다. Management Studio로 쿼리를 문제 해결할 때는 항상 클라이언트 ARITHABORT 설정과 일치하세요.
표현식 평가에서, 두 SET ARITHABORT 명이 모두 SET ANSI_WARNINGS 같 OFF 고 INSERT, , UPDATE, 또는 DELETE 문이 산술, 오버플로우, 0으로 나눗셈, 도메인 오류 등에 해당하면, 쿼리는 값을 삽입하거나 업데이트 NULL 합니다. 대상 열이 Null 허용이 아니면 삽입이나 업데이트 동작이 실패하고 사용자에게 오류 메시지가 표시됩니다.
의 SET ARITHABORT 설정은 실행 시점이나 실행 시점에 이루어지며, 파싱 시점에 이루어지지 않습니다.
SET ARITHABORT OFFAzure Synapse Analytics 전용 SQL 풀에서는 지원되지 않습니다.
사용 권한
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하고 실행하세요. - 이
ARITHABORT효과가 있도록 설정ANSI_WARNINGS OFF하고, 를 설정합니다ARITHABORT ON. 0으로 나누는 오차와 산술 오버플로우가 나타나는 동작을 테스트하세요. - 두 가지를 모두
ANSI_WARNINGS OFFARITHABORT OFF와 로 설정한다. 0으로 나누는 오차와 산술 오버플로우가 나타나는 동작을 테스트하세요. - 샘플 테이블을 정리하세요.
-- 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