복붙노트

[SQL] SQL Server에서 "SET ANSI_NULLS ON"은 무엇을 의미합니까?

SQL

SQL Server에서 "SET ANSI_NULLS ON"은 무엇을 의미합니까?

정의는 말한다 :

이것은 더 널 (null)이 쿼리에 포함되지 않음을 의미합니까?

SELECT Region
FROM employees
WHERE Region = @region

또는 할 ANSI_NULLS 우려는 (특정 단어 NULL을 포함)이 같은 쿼리?

SELECT Region
FROM employees
WHERE Region = NULL

해결법

  1. ==============================

    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. ==============================

    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. ==============================

    3.SET ANSI_NULLS ON

    SET ANSI_NULLS ON

    IT는 테이블에 널 값을 포함하여 모든 값을 반환

    SET 오프 ANSI_NULLS

    열이 null 값을 포함 할 때 그것은 끝

  4. ==============================

    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. ==============================

    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. ==============================

    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 !
    
  7. from https://stackoverflow.com/questions/9766717/in-sql-server-what-does-set-ansi-nulls-on-mean by cc-by-sa and MIT license