SET ANSI_NULLS (Transact-SQL)

적용 대상: SQL Server(지원되는 모든 버전) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System(PDW)

SQL Server의 Null 값과 함께 사용될 경우 Equals(=)와 Not Equal To(<>) 비교 연산자의 ISO 호환 동작을 지정합니다.

Topic link iconTransact-SQL 구문 규칙

구문

SQL Server 및 Azure Synapse Analytics의 서버리스 SQL 풀 구문

SET ANSI_NULLS { ON | OFF }

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

SET ANSI_NULLS ON

참고

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

설명

ANSI_NULLS 옵션이 ON인 경우, WHERE column_name = NULL을 사용하는 SELECT 문은 column_name에 null 값이 있어도 0행을 반환합니다. WHERE column_name<>NULL을 사용하는 SELECT 문은 column_name에 Null 이외의 값이 있어도 0행을 반환합니다.

ANSI_NULLS 옵션이 OFF면 Equals(=)와 Not Equal(<>) 비교 연산자가 ISO 표준을 따르지 않습니다. WHERE column_name = NULL을 사용하는 SELECT 문은 column_name에 Null 값이 있는 행을 반환합니다. WHERE column_name<>NULL을 사용하는 SELECT 문은 열에 Null 이외의 값이 있는 행을 반환합니다. 또한 WHERE column_name<>XYZ_value를 사용하는 SELECT 문은 XYZ_value가 아니고 NULL이 아닌 모든 행을 반환합니다.

ANSI_NULLS 옵션이 ON이면, null 값에 대한 모든 비교가 UNKNOWN이 됩니다. ANSI_NULLS 옵션이 OFF면 데이터 값이 NULL일 때 null 값에 대한 모든 데이터의 비교가 TRUE가 됩니다. SET ANSI_NULLS를 지정하지 않으면 현재 데이터베이스의 ANSI_NULLS 옵션 설정이 적용됩니다. ANSI_NULLS 데이터베이스 옵션에 대한 자세한 내용은 ALTER DATABASE(Transact-SQL)를 참조하세요.

다음 표에서는 ANSI_NULLS 설정이 null과 null이 아닌 값을 사용하여 많은 부울 식의 결과에 어떤 영향을 미치는지를 보여 줍니다.

부울 식(Boolean Expression) SET ANSI_NULLS ON SET ANSI_NULLS OFF
NULL = NULL UNKNOWN TRUE
1 = NULL UNKNOWN FALSE
NULL <> NULL UNKNOWN FALSE
1 <> NULL UNKNOWN TRUE
NULL > NULL UNKNOWN UNKNOWN
1 > NULL UNKNOWN UNKNOWN
NULL IS NULL TRUE TRUE
1 IS NULL FALSE FALSE
NULL IS NOT NULL FALSE FALSE
1 IS NOT NULL TRUE TRUE

SET ANSI_NULLS ON 옵션은 비교의 피연산자 중 하나가 NULL 변수 또는 리터럴 NULL 변수인 경우에만 해당 비교에 영향을 줍니다. 비교의 양쪽이 열 또는 복합 식인 경우에는 설정이 비교에 영향을 주지 않습니다.

ANSI_NULLS 데이터베이스 옵션이나 SET ANSI_NULLS 설정에 관계없이 스크립트가 의도했던 대로 실행되도록 하려면 Null 값을 포함할 수 있는 비교에 IS NULL과 IS NOT NULL을 사용하십시오.

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

계산 열이나 인덱싱된 뷰에서 인덱스를 만들거나 변경할 때는 ANSI_NULLS 옵션도 ON으로 설정해야 합니다. SET ANSI_NULLS 옵션이 OFF면 계산 열의 인덱스가 있는 테이블이나 인덱싱된 뷰에서 CREATE, UPDATE, INSERT, DELETE 문이 실패합니다. SQL Server는 필요한 값을 위반하는 모든 SET 옵션이 나열된 오류를 반환합니다. 뿐만 아니라 SELECT 문 실행 시 SET ANSI_NULLS 옵션이 OFF면 SQL Server는 계산 열이나 뷰의 인덱스 값을 무시하고 테이블이나 뷰에 이러한 인덱스가 없는 것처럼 SELECT 작업을 처리합니다.

참고

ANSI_NULLS는 계산 열이나 인덱싱된 뷰의 인덱스를 처리할 때 필요한 값으로 설정해야 하는 7가지 SET 옵션 중 하나입니다. ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, QUOTED_IDENTIFIERCONCAT_NULL_YIELDS_NULL 옵션도 ON으로 설정해야 하고 NUMERIC_ROUNDABORT를 OFF로 설정해야 합니다.

SQL Server Native Client ODBC 드라이버와 SQL Server용 SQL Server Native Client OLE DB 공급자는 연결될 때 자동으로 ANSI_NULLS를 ON으로 설정합니다. ODBC 데이터 원본과 ODBC 연결 특성 또는 SQL Server 인스턴스에 연결하기 전에 애플리케이션에 설정된 OLE DB 연결 속성에서 이 설정을 구성할 수 있습니다. SET ANSI_NULLS의 기본값은 OFF입니다.

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

ANSI_NULLS 옵션은 실행 시 또는 런타임에 정의되며 구문 분석 시에는 정의되지 않습니다.

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

DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF';  
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON';  
SELECT @ANSI_NULLS AS ANSI_NULLS;   

사용 권한

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

예제

다음 예에서는 Equals(=)와 Not Equal To(<>) 비교 연산자를 사용하여 테이블의 NULL 및 Null이 아닌 값에 비교를 수행합니다. 또한 IS NULLSET ANSI_NULLS 설정의 영향을 받지 않는다는 것을 보여 줍니다.

-- Create table t1 and insert values.  
CREATE TABLE dbo.t1 (a INT NULL);  
INSERT INTO dbo.t1 values (NULL),(0),(1);  
GO  
  
-- Print message and perform SELECT statements.  
PRINT 'Testing default setting';  
DECLARE @varname int;   
SET @varname = NULL;  
  
SELECT a  
FROM t1   
WHERE a = @varname;  
  
SELECT a   
FROM t1   
WHERE a <> @varname;  
  
SELECT a   
FROM t1   
WHERE a IS NULL;  
GO 

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

PRINT 'Testing ANSI_NULLS ON';  
SET ANSI_NULLS ON;  
GO  
DECLARE @varname int;  
SET @varname = NULL  
  
SELECT a   
FROM t1   
WHERE a = @varname;  
  
SELECT a   
FROM t1   
WHERE a <> @varname;  
  
SELECT a   
FROM t1   
WHERE a IS NULL;  
GO  

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

PRINT 'Testing ANSI_NULLS OFF';  
SET ANSI_NULLS OFF;  
GO  
DECLARE @varname int;  
SET @varname = NULL;  
SELECT a   
FROM t1   
WHERE a = @varname;  
  
SELECT a   
FROM t1   
WHERE a <> @varname;  
  
SELECT a   
FROM t1   
WHERE a IS NULL;  
GO  
  
-- Drop table t1.  
DROP TABLE dbo.t1;  

참고 항목

SET 문(Transact-SQL)
SESSIONPROPERTY(Transact-SQL)
=(같음)(Transact-SQL)
IF...ELSE(Transact-SQL)
<>(같지 않음)(Transact-SQL)
SET 문(Transact-SQL)
SET ANSI_DEFAULTS(Transact-SQL)
WHERE(Transact-SQL)
WHILE(Transact-SQL)