[SQL] SQL Server에서 "SET ANSI_NULLS ON"은 무엇을 의미합니까?
SQLSQL Server에서 "SET ANSI_NULLS ON"은 무엇을 의미합니까?
정의는 말한다 :
이것은 더 널 (null)이 쿼리에 포함되지 않음을 의미합니까?
SELECT Region
FROM employees
WHERE Region = @region
또는 할 ANSI_NULLS 우려는 (특정 단어 NULL을 포함)이 같은 쿼리?
SELECT Region
FROM employees
WHERE Region = NULL
해결법
-
==============================
1.그것은 @region가 NULL의 경우 지역이 NULL 테이블에 행이 경우에도 첫 번째 예제에서 사용할 때 행이 반환되지 않음을 의미합니다.
그것은 @region가 NULL의 경우 지역이 NULL 테이블에 행이 경우에도 첫 번째 예제에서 사용할 때 행이 반환되지 않음을 의미합니다.
ANSI_NULLS는 (적어도) 피연산자 중 하나가 NULL 어떤 비교 작업이 세 번째 논리 값을 생성, (당신은 항상 미래에 제거 될 것입니다 그것을하지 할 수있는 옵션이 있기 때문에, 어쨌든에 설정해야하는)에있는 경우 - UNKNOWN (TRUE 및 FALSE 반대).
그들은 이미 (예를 들어, AND 거짓 피연산자 또는 OR TRUE로 피연산자와 함께) 또는 부정 (NOT) 결정하지 않는 경우 UNKNOWN 값은 결합 부울 연산자를 통해 전파.
Where 절 절에서의 결과로서 생성 된 세트를 필터링하는 데 사용되는 필터링되지 행의 전체 값이 절은 행 TRUE 있어야 WHERE되도록. UNKNOWN 임의의 비교에 의해 발생되는 경우에 따라서, 그 행이 필터링되도록한다.
@ user1227804의 대답이 견적을 포함합니다 :
SET는 ANSI_NULLS에서 *
그러나, 나는이 개 NULL 컬럼 (예를 들어,에서가 가입), 비교가 계속 실패 비교하면 이후로는 만들려고 노력의 관점 모르겠어요 :
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 않습니다. 그리고 = 설명서는 피연산자에 대해 할 말이 아무것도하지 않습니다
그러나 두 1과 2는 잘못된 - 모두 비교의 결과는 알 수 없습니다.
*이 텍스트의 비밀 의미는 마지막 년 후에 발견되었다. 이것은 실제로하는 것을하고, 그 비교를 들어, 설정이 적용되지 않습니다 그것은 항상 설정이 ON 인 경우에 역할을합니다. 이 SET ANSI_NULLS OFF 더 영향을했던 설정이라고 언급했다 경우 명확하게되었을 것이다.
-
==============================
2.@Region에 null 값이 아닌 경우 지역 필드에 관계없이 ANSI_NULLS의 값에 널 어디 행을 반환하지 않습니다 (@Region = '남쪽'라고 할 수 있습니다).
@Region에 null 값이 아닌 경우 지역 필드에 관계없이 ANSI_NULLS의 값에 널 어디 행을 반환하지 않습니다 (@Region = '남쪽'라고 할 수 있습니다).
최초 질의 본질적 번째지면 @Region의 값, 즉 널 (null) 인 경우 ANSI_NULLS 만 차이를 만들 것이다.
지역 필드가 널이 (NULL = NULL 때문에 참 수득 됨)이고이 경우 ANSI_NULLS ON은 (NULL = NULL 때문에 미지 부울 값 (일명, 널 (null)을 수득한다)) 행을 반환하지 않으며 ANSI_NULLS OFF 모든 행을 반환
-
==============================
3.SET ANSI_NULLS ON
SET ANSI_NULLS ON
IT는 테이블에 널 값을 포함하여 모든 값을 반환
SET 오프 ANSI_NULLS
열이 null 값을 포함 할 때 그것은 끝
-
==============================
4.ANSI_NULLS를 "ON"으로 설정하고 SELECT 문을 쓰는 동안 우리가 NULL 열 값에 =, <> 적용 할 경우 그것은 어떤 결과를 반환하지 않습니다.
ANSI_NULLS를 "ON"으로 설정하고 SELECT 문을 쓰는 동안 우리가 NULL 열 값에 =, <> 적용 할 경우 그것은 어떤 결과를 반환하지 않습니다.
예
create table #tempTable (sn int, ename varchar(50)) insert into #tempTable values (1, 'Manoj'), (2, 'Pankaj'), (3, NULL), (4, 'Lokesh'), (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)
-
==============================
5.설정 ANSI_NULLS OFF는 NULL = NULL 비교 반환 사실 만들 것입니다. EG :
설정 ANSI_NULLS OFF는 NULL = NULL 비교 반환 사실 만들 것입니다. EG :
SET ANSI_NULLS OFF select * from sys.tables where principal_id = Null
아래에 표시 일부 결과를 반환합니다 : zcwInvoiceDeliveryType 744547 NULL zcExpenseRptStatusTrack 2,099,048 NULL ZCVendorPermissions 2,840,564 NULL ZCWOrgLevelClientFee 4,322,525 NULL
이 쿼리는 결과를 반환하지 않지만 :
SET ANSI_NULLS ON select * from sys.tables where principal_id = Null
-
==============================
6.https://docs.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql
https://docs.microsoft.com/en-us/sql/t-sql/statements/set-ansi-nulls-transact-sql
SET ANSI_NULLS가 ON, COLUMN_NAME = NULL 반환 행을 제로 사용은 COLUMN_NAME에 null 값이있는 경우에도 것을 SELECT 문 경우. COLUMN_NAME <> NULL 반환 행을 제로 사용은 COLUMN_NAME에 Null이 아닌 값이있는 경우에도 것을 SELECT 문.
에 대한 예 :
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 !
from https://stackoverflow.com/questions/9766717/in-sql-server-what-does-set-ansi-nulls-on-mean by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 2008 SQL에 외래 키 관계에서 삭제 정책을 생성? (0) | 2020.04.19 |
---|---|
[SQL] 형식화 된 목록에서 IDataReader에 가져 오기 (0) | 2020.04.19 |
[SQL] 나는 VARCHAR 또는 INT의 기본 키가있는 테이블을 설계해야 하는가? (0) | 2020.04.19 |
[SQL] 중복을 무시하고, 다른 한 테이블에서 행을 복사 (0) | 2020.04.18 |
[SQL] OUTFILE로 MySQL의 수출 : CSV 탈출 문자 (0) | 2020.04.18 |