SQL Server에서 "SET ANSI_NULLS ON"은 무엇을 의미합니까?
정의에 따르면 :
SET ANSI_NULLS가 ON이면 WHERE column_name = NULL을 사용하는 SELECT 문은 column_name에 null 값이 있더라도 0 행을 반환합니다. WHERE column_name <> NULL을 사용하는 SELECT 문은 column_name에 null이 아닌 값이 있어도 0 행을 반환합니다.
이것은이 쿼리에 null이 포함되지 않음을 의미합니까?
SELECT Region
FROM employees
WHERE Region = @region
아니면이 ANSI_NULL
같은 쿼리에만 관심이 있습니까 (여기 WHERE
에 특정 단어 가 포함됨 NULL
)?
SELECT Region
FROM employees
WHERE Region = NULL
즉 , 첫 번째 예제에서 사용될 때 @region
is NULL
인 경우 테이블에 Region
is 인 행이 있더라도 행이 반환되지 않습니다 NULL
.
ANSI_NULLS
이 on 일 때 (항상 설정해야합니다.이 옵션을 사용하지 않는 옵션은 나중에 제거 될 예정이므로), 피연산자 중 하나가 (적어도) 하나가있는 비교 연산 NULL
은 세 번째 논리 값- UNKNOWN
( 반대로 TRUE
하고 FALSE
).
UNKNOWN
그들은 이미 (예를 들어 결정하지 않는 경우 값이 어떤 조합 부울 연산자를 통해 전파 AND
와 FALSE
피연산자 또는 OR
와 TRUE
피연산자) 또는 부정 ( NOT
).
WHERE
절에 의해 생성 된 결과 세트를 필터링하는 데 사용되는 FROM
절의 전반적인 값이되도록 WHERE
절이어야 TRUE
하는 행에 대한 필터링 할 수 없다. 따라서 UNKNOWN
어떤 비교에 의해 생성되면 행이 필터링됩니다.
@ user1227804의 답변 에는 다음 인용문이 포함됩니다.
비교의 양쪽이 열 또는 복합 표현식 인 경우 설정은 비교에 영향을주지 않습니다.
에서 *SET ANSI_NULLS
그러나 두 NULL
열을 비교하면 (예 : a JOIN
) 비교가 여전히 실패 하기 때문에 어떤 지점을 만들려고하는지 잘 모르겠습니다 .
create table #T1 (
ID int not null,
Val1 varchar(10) null
)
insert into #T1(ID,Val1) select 1,null
create table #T2 (
ID int not null,
Val1 varchar(10) null
)
insert into #T2(ID,Val1) select 1,null
select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and t1.Val1 = t2.Val1
위의 쿼리는 0 개의 행을 반환하는 반면 :
select * from #T1 t1 inner join #T2 t2 on t1.ID = t2.ID and (t1.Val1 = t2.Val1 or t1.Val1 is null and t2.Val1 is null)
한 행을 반환합니다. 따라서 두 피연산자가 모두 열인 경우에도 NULL
같지 않습니다 NULL
. 그리고에 대한 문서=
에는 피연산자에 대해 말할 것이 없습니다.
두
NULL
표현식 을 비교할 때 결과는ANSI_NULLS
설정에 따라 다릅니다 .가로
ANSI_NULLS
설정된 경우ON
결과는NULL
1 이며NULL
(또는 알 수없는) 값이 다른NULL
값이나 알 수없는 값 과 같지 않다는 ANSI 규칙을 따릅니다 .가로
ANSI_NULLS
설정된 경우 비교OFF
결과 는 입니다.NULL
NULL
TRUE
값
NULL
이 아닌NULL
값과 비교하면 항상FALSE
2가 됩니다.
그러나 1 과 2 는 모두 정확하지 않습니다 UNKNOWN
. 두 비교 결과는 모두입니다 .
* 이 텍스트의 비밀스러운 의미는 몇 년 후 마침내 발견되었습니다. 실제로 의미하는 것은 이러한 비교에서 설정이 효과가 없으며 항상 설정이 ON 인 것처럼 작동한다는 것 입니다. 그것이 SET ANSI_NULLS OFF
영향을 미치지 않는 설정이라고 언급했다면 더 분명했을 것 입니다.
값 @Region
이 아닌 경우 null
(라고 말하면 @Region = 'South'
) ANSI_NULLS 값에 관계없이 Region 필드가 null 인 행을 반환하지 않습니다.
ANSI_NULLS는의 값이 인 @Region
경우 null
, 즉 첫 번째 쿼리가 본질적으로 두 번째 쿼리가되는 경우에만 차이를 만듭니다 .
이 경우 ANSI_NULLS ON은 행을 반환하지 않으며 ( null = null
알 수없는 부울 값 (일명 null
) 을 생성 하기 때문에 ) ANSI_NULLS OFF는 Region 필드가 null 인 모든 행을 반환합니다 ( null = null
를 생성 하기 때문에 true
).
ANSI_NULLS 설정
IT는 테이블의 null 값을 포함한 모든 값을 반환합니다.
ANSI_NULLS 설정 해제
열이 널값을 포함 할 때 종료됩니다.
ANSI NULLS를 OFF로 설정하면 NULL = NULL 비교가 true를 반환합니다. 예 :
SET ANSI_NULLS OFF
select * from sys.tables
where principal_id = Null
아래와 같이 일부 결과를 반환합니다. zcwInvoiceDeliveryType 744547 NULL zcExpenseRptStatusTrack 2099048 NULL ZCVendorPermissions 2840564 NULL ZCWOrgLevelClientFee 4322525 NULL
이 쿼리는 결과를 반환하지 않습니다.
SET ANSI_NULLS ON
select * from sys.tables
where principal_id = Null
https://docs.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql
When SET ANSI_NULLS is ON, a SELECT statement that uses WHERE column_name = NULL returns zero rows even if there are null values in column_name. A SELECT statement that uses WHERE column_name <> NULL returns zero rows even if there are nonnull values in column_name.
For e.g
DECLARE @TempVariable VARCHAR(10)
SET @TempVariable = NULL
SET ANSI_NULLS ON
SELECT 'NO ROWS IF SET ANSI_NULLS ON' where @TempVariable = NULL
-- IF ANSI_NULLS ON , RETURNS ZERO ROWS
SET ANSI_NULLS OFF
SELECT 'THERE WILL BE A ROW IF ANSI_NULLS OFF' where @TempVariable =NULL
-- IF ANSI_NULLS OFF , THERE WILL BE ROW !
If ANSI_NULLS is set to "ON" and if we apply = , <> on NULL column value while writing select statement then it will not return any result .
Example
create table #tempTable (sn int, ename varchar(50))
insert into #tempTable
select 1, 'Manoj'
UNION ALL
select 2, 'Pankaj'
UNION ALL
select 3, NULL
UNION ALL
select 4, 'Lokesh'
UNION ALL
select 5, 'Gopal'
SET ANSI_NULLS ON
select * from #tempTable where ename is NULL -- (1 row(s) affected)
select * from #tempTable where ename = NULL -- (0 row(s) affected)
select * from #tempTable where ename <> NULL -- (0 row(s) affected)
SET ANSI_NULLS OFF
select * from #tempTable where ename is NULL -- (1 row(s) affected)
select * from #tempTable where ename = NULL -- (1 row(s) affected)
select * from #tempTable where ename is not NULL -- (4 row(s) affected)
select * from #tempTable where ename <> NULL -- (4 row(s) affected)
참고URL : https://stackoverflow.com/questions/9766717/in-sql-server-what-does-set-ansi-nulls-on-mean
'developer tip' 카테고리의 다른 글
여러 언어로 된 정규식에 대한 단위 테스트는 어디에서 찾을 수 있습니까? (0) | 2020.10.15 |
---|---|
바이너리 파일 형식을 리버스 엔지니어링하는 데 도움이되는 도구 (0) | 2020.10.15 |
투기. (0) | 2020.10.15 |
MARS (Multiple Active Result Sets)의 단점은 무엇입니까? (0) | 2020.10.15 |
(큰?) 수의 값에 대한 MySQL "IN"연산자 성능 (0) | 2020.10.15 |