SQL Server uses a three valued logic with True, False, and Unknown. And, normally, SQL Server Nulls are not comparable. Together that means that this little script:
if Null = Null -- Results in Unknown print 'Num 1' if Null != Null -- Results in Unknown print 'Num 2' if not (Null = Null) or not (Null != Null) -- Results in Unknown print 'Num 3'
normally produces no results. It simply prints the standard ‘Command(s) completed successfully.’ One significant implication of this is that if the where clause includes something like
[column_name] = null
It will filter out all rows. The best way to look for Nulls is to use
[column_name] is null
But, whether or not Nulls are comparable can be controlled by the use of the Ansi_Nulls session setting. The default for Ansi_Nulls is on, and in fact the documentation warns that ANSI_NULLS may always be ON, with no way to turn it off, in future versions. Until then, this test script:
Set Ansi_nulls off if Null = Null -- Now Results in True print 'Num 1' if Null != Null -- Now False print 'Num 2' if not (Null = Null) or not (Null != Null) -- Now True print 'Num 3'
Dutifully prints out:
Num 1 Num 3
It is generally best to leave Ansi_nulls in its standards compliant default setting and use “is null” or “is not null”, but occasionally it can be useful to change that.
[20 Aug 13 – Updated to add tags and change category]