다음을 통해 공유


SET ANSI_WARNINGS(Transact-SQL)

적용 대상: Microsoft Fabric의 Microsoft Fabric Warehouse에 있는 SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Platform System(PDW) SQL 분석 엔드포인트

여러 오류 상황에 대한 ISO 표준 동작을 지정합니다.

Transact-SQL 구문 표기 규칙

구문

SQL Server 구문, Azure Synapse Analytics의 서버리스 SQL 풀, Microsoft Fabric

SET ANSI_WARNINGS { ON | OFF }

Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW) 구문

SET ANSI_WARNINGS ON

참고 항목

SQL Server 2014(12.x) 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.

설명

SET ANSI_WARNINGS는 다음 조건에 적용됩니다.

  • ON으로 설정한 경우 SUM, AVG, MAX, MIN, STDEV, STDEVP, VAR, VARP, COUNT 등의 집계 함수에 NULL 값이 있으면 경고 메시지가 생성됩니다. OFF로 설정한 경우에는 경고가 발생하지 않습니다.

  • ON으로 설정한 경우 0으로 나누기 및 산술 오버플로 오류가 발생하면 문이 롤백되고 오류 메시지가 생성됩니다. OFF로 설정한 경우 0으로 나누기 및 산술 오버플로 오류가 발생하면 NULL 값이 반환됩니다. 새 값의 길이가 열의 최대 크기를 초과하는 character, Unicode 또는 binary 열에 INSERT나 UPDATE를 시도하면 0으로 나누기 또는 산술 오버플로 오류로 인해 Null 값이 반환될 수 있습니다. SET ANSI_WARNINGS 옵션이 ON이면 ISO 표준에 지정된 대로 INSERT나 UPDATE가 취소됩니다. 문자 열에 대해서는 후행 공백이, 이진 열에 대해서는 후행 NULL 값이 무시됩니다. 이 옵션이 OFF이면 열의 크기에 맞게 데이터가 잘리고 문이 성공적으로 실행됩니다.

참고

binary 또는 varbinary 데이터로 또는 그 역으로의 변환에서 잘림이 일어날 때는 SET 옵션에 상관없이 경고나 오류가 생성되지 않습니다.

참고

저장 프로시저 또는 사용자 정의 함수에 매개 변수를 전달할 때 또는 일괄 처리 문에서 변수를 선언하고 설정할 때 ANSI_WARNINGS는 인식되지 않습니다. 예를 들어 변수가 char(3) 로 정의된 경우 3자보다 큰 값으로 설정하면 해당 데이터가 정의된 크기로 잘리고 INSERT 또는 UPDATE 문은 성공합니다.

사용자 옵션 옵션을 sp_configure 사용하여 서버에 대한 모든 연결에 대한 ANSI_WARNINGS 기본 설정을 설정할 수 있습니다. 자세한 내용은 sp_configure(Transact-SQL)를 참조하세요.

계산 열이나 인덱싱된 뷰에서 인덱스를 만들거나 조작할 때는 ANSI_WARNINGS 옵션을 ON으로 설정해야 합니다. SET ANSI_WARNINGS 옵션이 OFF이면 인덱싱된 뷰나 계산 열에 인덱스가 있는 테이블에서 CREATE, UPDATE, INSERT, DELETE 문이 실패합니다. 인덱싱된 뷰 및 계산 열의 인덱스에 사용되는 필수 SET 옵션 설정에 대한 자세한 내용은 SET 문(Transact-SQL)에서 "SET 문 사용 시 고려 사항"을 참조하세요.

SQL Server에는 ANSI_WARNINGS 데이터베이스 옵션이 포함되어 있습니다. 이 옵션은 SET ANSI_WARNINGS와 같습니다. SET ANSI_WARNINGS 옵션이 ON이면, 0으로 나누기나 데이터베이스 열에 대해 너무 큰 문자열에서 오류나 경고가 발생하고, 기타 유사한 오류가 발생합니다. SET ANSI_WARNINGS 옵션이 OFF이면 이러한 오류나 경고가 발생하지 않습니다. SET ANSI_WARNINGS 데이터베이스의 model 기본값은 OFF입니다. 이 옵션을 지정하지 않으면 ANSI_WARNINGS 설정이 적용됩니다. SET ANSI_WARNINGS를 OFF로 설정하면 SQL Server가 sys.databases 카탈로그 뷰에 있는 is_ansi_warnings_on 열의 값을 사용합니다.

중요

분산 쿼리를 실행할 때는 ANSI_WARNINGS를 ON으로 설정해야 합니다.

SQL Server Native Client ODBC 드라이버, SQL Server에 대한 SQL Server Native Client OLE DB 공급자 및 SQL Server용 Microsoft JDBC Driver와 같은 클라이언트는 연결 플래그를 사용하여 자동으로 ANSI_WARNINGS를 ON으로 설정합니다. 이 옵션은 연결하기 전에 애플리케이션에 설정된 ODBC 데이터 원본과 ODBC 연결 특성에서 구성할 수 있습니다. DB-Library 애플리케이션으로부터 연결할 때 SET ANSI_WARNINGS의 기본값은 OFF입니다. 자세한 내용은 TDS(Tabular Data Stream) 프로토콜 사양에서 LOGIN7을 참조하세요.

ANSI_DEFAULTS 옵션이 ON이면 ANSI_WARNINGS가 활성화됩니다.

ANSI_WARNINGS 옵션은 실행 시 또는 런타임에 정의되며 구문 분석 시에는 정의되지 않습니다. 모든 SET 문과 마찬가지로 SET ANSI_WARNINGS 현재 세션에 영향을 줍니다.

SET ARITHABORT 옵션이나 SET ARITHIGNORE 옵션 중 하나가 OFF이고 SET ANSI_WARNINGS 옵션이 ON이면 SQL Server에서 0으로 나누기 또는 오버플로 오류가 발생할 경우 여전히 오류 메시지를 반환합니다.

이 설정에 대한 현재 설정을 보려면 다음 쿼리를 실행합니다.

DECLARE @ANSI_WARN VARCHAR(3) = 'OFF';  
IF ( (8 & @@OPTIONS) = 8 ) SET @ANSI_WARN = 'ON';  
SELECT @ANSI_WARN AS ANSI_WARNINGS;  

사용 권한

public 역할의 멤버 자격이 필요합니다.

다음 예에서는 앞에서 언급한 대로 SET ANSI_WARNINGS 옵션이 ON과 OFF로 설정되었을 때의 세 가지 상황을 보여 줍니다.

CREATE TABLE T1   
(  
   a int,   
   b int NULL,   
   c varchar(20)  
);  
GO  
  
SET NOCOUNT ON;  
  
INSERT INTO T1   
VALUES (1, NULL, '')   
      ,(1, 0, '')  
      ,(2, 1, '')  
      ,(2, 2, '');  
  
SET NOCOUNT OFF;  
GO  

이제 ANSI_WARNINGS를 ON으로 설정하고 테스트합니다.

PRINT '**** Setting ANSI_WARNINGS ON';  
GO  
  
SET ANSI_WARNINGS ON;  
GO  
  
PRINT 'Testing NULL in aggregate';  
GO  
SELECT a, SUM(b)   
FROM T1   
GROUP BY a;  
GO  
  
PRINT 'Testing String Overflow in INSERT';  
GO  
INSERT INTO T1   
VALUES (3, 3, 'Text string longer than 20 characters');  
GO  
  
PRINT 'Testing Divide by zero';  
GO  
SELECT a / b AS ab   
FROM T1;  
GO  

이제 ANSI_WARNINGS를 OFF로 설정하고 테스트합니다.

PRINT '**** Setting ANSI_WARNINGS OFF';  
GO  
SET ANSI_WARNINGS OFF;  
GO  
  
PRINT 'Testing NULL in aggregate';  
GO  
SELECT a, SUM(b)   
FROM T1   
GROUP BY a;  
GO  
  
PRINT 'Testing String Overflow in INSERT';  
GO  
INSERT INTO T1   
VALUES (4, 4, 'Text string longer than 20 characters');  
GO  
SELECT a, b, c   
FROM T1  
WHERE a = 4;  
GO  
  
PRINT 'Testing Divide by zero';  
GO  
SELECT a / b AS ab   
FROM T1;  
GO  
  
DROP TABLE T1;