SET ARITHABORT(Transact-SQL)
적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW) Microsoft Fabric의 SQL 분석 엔드포인트 Microsoft Fabric의 웨어하우스
쿼리 실행 중 오버플로 또는 0으로 나누기 오류가 발생하면 쿼리를 종료합니다.
구문
SQL Server 구문, Azure Synapse Analytics의 서버리스 SQL 풀, Microsoft Fabric
SET ARITHABORT { ON | OFF }
Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW) 구문
SET ARITHABORT ON
설명
로그온 세션에서 ARITHABORT를 항상 ON으로 설정합니다. ARITHABORT를 OFF로 설정하면 쿼리 최적화에 부정적인 영향을 주어 성능 문제가 발생할 수 있습니다.
경고
SQL Server Management Studio에 대한 기본 ARITHABORT 설정은 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가 OFF이고 이러한 오류 중 하나가 발생하면 경고 메시지가 표시되고 산술 연산 NULL
결과가 발생합니다.
참고 항목
SET ARITHABORT 또는 SET ARITHIGNORE가 ON이 아니면 SQL Server가 반환 NULL
되고 쿼리가 실행된 후 경고 메시지가 표시됩니다.
ANSI_WARNINGS의 값이 ON이고 데이터베이스 호환성 수준이 90 이상으로 설정된 경우, ARITHABORT는 값 설정과 관계없이 암시적으로 ON이 됩니다. 데이터베이스 호환성 수준이 80 이하로 설정된 경우에는 명시적으로 ARITHABORT 옵션을 ON으로 설정해야 합니다.
식 평가의 경우 SET ARITHABORT가 OFF이고 INSERT, UPDATE 또는 DELETE 문이 산술, 오버플로, 0으로 나누기 또는 도메인 오류에서 오는 경우 SQL Server는 값을 삽입하거나 업데이트합니다 NULL
. 대상 열이 Null 허용이 아니면 삽입이나 업데이트 동작이 실패하고 사용자에게 오류 메시지가 표시됩니다.
SET ARITHABORT 또는 SET ARITHIGNORE 옵션 중 하나가 OFF이고 SET ANSI_WARNINGS가 ON이면 SQL Server에서 0으로 나누기 또는 오버플로 오류가 발생할 경우 여전히 오류 메시지를 반환합니다.
SET ARITHABORT가 OFF이고 IF 문의 부울 조건을 평가하는 동안 중단 오류가 발생하면 FALSE 분기가 실행됩니다.
계산 열이나 인덱싱된 뷰에서 인덱스를 만들거나 변경할 경우 SET ARITHABORT는 ON이어야 합니다. SET ARITHABORT가 OFF이면 계산 열 또는 인덱싱된 열에 인덱스가 있는 테이블에서 CREATE, UPDATE, INSERT, DELETE 문이 실패합니다.
SET ARITHABORT는 실행 시간 또는 런타임에 설정되며, 구문 분석 시에는 설정되지 않습니다.
SET ARITHABORT OFF는 Azure Synapse Analytics 전용 SQL 풀에서 지원되지 않습니다.
SET ARITHABORT의 현재 설정을 보려면 다음 쿼리를 실행합니다.
DECLARE @ARITHABORT VARCHAR(3) = 'OFF';
IF ( (64 & @@OPTIONS) = 64 ) SET @ARITHABORT = 'ON';
SELECT @ARITHABORT AS ARITHABORT;
사용 권한
public 역할의 멤버 자격이 필요합니다.
예제
다음 예에서는 SET ARITHABORT
설정이 있는 0으로 나누기 및 오버플로 오류를 보여 줍니다.
-- 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