다음을 통해 공유


SET ANSI_NULLS(Transact-SQL)

적용 대상: SQL ServerAzure SQL 데이터베이스Azure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System(PDW)

SQL Server에서 값과 함께 = 사용될 때 Equals(<>) 및 Not Equal To(NULL) 비교 연산자의 ISO 규격 동작을 지정합니다.

  • SET ANSI_NULLS ON- 값이 .인 것처럼 {expression} = NULL 둘 다 {expression} <> NULLFalse 평가합니다{expression}.NULL 이 동작은 ANSI 규격입니다.
  • SET ANSI_NULLS OFF- 값이 {expression} = NULL .인 것처럼 True{expression} <> NULLFalse 계산됩니다.{expression}NULL 사용 및 NULL 연산자를 = 사용하여 <> 값을 비교해서는 안 되므로 이 동작은 권장되지 않습니다.

참고 항목

SET ANSI_NULLS OFF ANSI_NULLS OFF 데이터베이스 옵션은 더 이상 사용되지 않습니다. SQL Server 2017(14.x)부터 ANSI_NULLS 항상 ON으로 설정됩니다. 새 애플리케이션에는 이러한 기능을 사용하면 안 됩니다. 자세한 내용은 SQL Server 2017에서 사용되지 않는 데이터베이스 엔진 기능을 참조하세요.

Transact-SQL 구문 표기 규칙

구문

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

SET ANSI_NULLS { ON | OFF }

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

SET ANSI_NULLS ON

설명

ON인 경우 ANSI_NULLS 사용하는 문 SELECTWHERE column_name = NULL NULL 값이 있더라도 0개의 행을 반환합니다. SELECT WHERE column_name <> NULL NULL이 아닌 값이 있더라도 사용하는 문은 0개의 행을 반환합니다.

ANSI_NULLS OFF인 경우 등호(=)와 같지 않음(<>) 비교 연산자는 ISO 표준을 따르지 않습니다. 사용하는 문은 SELECT null 값이 있는 행을 반환합니다.WHERE column_name = NULL SELECT 사용하는 WHERE column_name <> NULL 문은 열에 값NULL이 아닌 행을 반환합니다. 또한 사용하는 SELECT 문은 WHERE column_name <> XYZ_valueXYZ_value 않고 그렇지 않은 NULL모든 행을 반환합니다.

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

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

부울 식(Boolean Expression) ANSI_NULLS 설정 ANSI_NULLS 끄기
NULL = NULL 알 수 없음 진실
1 = NULL 알 수 없음 거짓
NULL <> NULL 알 수 없음 거짓
1 <> NULL 알 수 없음 진실
NULL > NULL 알 수 없음 알 수 없음
1 > NULL 알 수 없음 알 수 없음
NULL IS NULL 진실 진실
1 IS NULL 거짓 거짓
NULL IS NOT NULL 거짓 거짓
1 IS NOT NULL 진실 진실

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

데이터베이스 옵션이나 설정에 관계없이 ANSI_NULLS 스크립트가 의도한 대로 작동하려면 null 값을 포함할 수 있는 비교에서 사용합니다 SET ANSI_NULLSIS NULL.IS NOT NULL

ANSI_NULLS 분산 쿼리를 실행하려면 ON으로 설정해야 합니다.

ANSI_NULLS 계산 열 또는 인덱싱된 뷰에서 인덱스를 만들거나 변경할 때도 ON이어야 합니다. SET ANSI_NULLS OFF이면 계산 열 또는 인덱싱된 뷰에서 인덱스가 있는 테이블의 모든CREATE, UPDATEINSERTDELETE 및 문이 실패합니다. SQL Server는 필요한 값을 위반하는 모든 SET 옵션이 나열된 오류를 반환합니다. 또한 문을 실행할 SELECT 때 OFF인 경우 SET ANSI_NULLS SQL Server는 계산 열 또는 뷰의 인덱스 값을 무시하고 테이블 또는 뷰에 이러한 인덱스가 없는 것처럼 선택 작업을 확인합니다.

참고 항목

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 Native Client OLE DB Provider for SQL Server가 자동으로 ON으로 설정 ANSI_NULLS 됩니다. ODBC 데이터 원본과 ODBC 연결 특성 또는 SQL Server 인스턴스에 연결하기 전에 애플리케이션에 설정된 OLE DB 연결 속성에서 이 설정을 구성할 수 있습니다. 기본값 SET ANSI_NULLS 은 OFF입니다.

ON ANSI_DEFAULTS 인 경우 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 역할의 멤버 자격이 필요합니다.

예제

다음 예제에서는 등호(=) 및 같지 않음(<>) 비교 연산자를 사용하여 변수의 값과 NULL0 비교 null 합니다.

SET ANSI_NULLS OFF
DECLARE @var INT = NULL
SELECT
    IIF(@var = NULL,  'True', 'False') as EqualNull,
    IIF(@var <> NULL, 'True', 'False') as DifferentNull,
    IIF(@var = 0,     'True', 'False') as EqualZero,
    IIF(@var <> 0,    'True', 'False') as DifferentZero

결과는 다음 표에 나와 있습니다.

EqualNull DifferentNull입니다 이퀄제로 디퍼런트제로
진실 거짓 거짓 진실

SET ANSI_NULLS ON 모든 식은 이러한 연산자를 비교 NULL 하거나 NULL 사용할 수 없으므로 0 'False'로 평가됩니다.

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

-- 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;