轉 http://www.cnblogs.com/xmaiC/archive/2009/04/15/1436813.html
當
SET ANSI_NULLS 為 ON 時,即使 column_name 中包含空值,使用 WHERE column_name = NULL
的 SELECT 語句仍返回零行。即使 column_name 中包含非空值,使用 WHERE column_name <>
NULL 的 SELECT 語句仍會返回零行。
當 SET ANSI_NULLS 為 OFF 時,等于 (=) 和不等于
(<>) 比較運算符不遵守 ISO 標準。使用 WHERE column_name = NULL 的 SELECT 語句返回
column_name 中包含空值的行。使用 WHERE column_name <> NULL 的 SELECT
語句返回列中包含非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT
語句返回所有不為 XYZ_value 也不為 NULL 的行。
當 SET ANSI_NULLS 為 ON 時,所有對
null 值的比較均取值為 UNKNOWN。當 SET ANSI_NULLS 為 OFF 時,如果數據值為
NULL,則所有數據對空值的比較將取值為 TRUE。如果未指定 SET ANSI_NULLS,則應用當前數據庫的 ANSI_NULLS
選項設置。有關 ANSI_NULLS 數據庫選項的詳細信息,請參閱 ALTER DATABASE (Transact-SQL)
和設置數據庫選項。
僅當某個比較操作數是值為 NULL 的變量或文字 NULL 時,SET ANSI_NULLS ON 才會影響比較。如果比較雙方是列或復合表達式,則該設置不會影響比較。
為使腳本按預期運行,不管 ANSI_NULLS 數據庫選項或 SET ANSI_NULLS 的設置如何,請在可能包含空值的比較中使用 IS NULL 和 IS NOT NULL。
在執行分布式查詢時應將 SET ANSI_NULLS 設置為 ON。
對
計算列或索引視圖創建或更改索引時,SET ANSI_NULLS 也必須為 ON。如果 SET ANSI_NULLS 為
OFF,則針對表(包含計算列或索引視圖的索引)的 CREATE、UPDATE、INSERT 和 DELETE 語句將失敗。SQL Server
將返回一個錯誤消息,該錯誤消息會列出所有違反所需值的 SET 選項。另外,在執行 SELECT 語句時,如果 SET ANSI_NULLS 為
OFF,則 SQL Server 將忽略計算列或視圖的索引值并解析選擇操作,就好像表或視圖沒有這樣的索引一樣。
實例:
--1.設置ANSI_NULLS為ON時,返回零行
SET ANSI_NULLS ON
GO
SELECT*FROM xmai WHERE id=NULL
SELECT*FROM xmai WHERE id<>NULL
執行結果:
id name
----------- --------------------
(0 行受影響)
id name
----------- --------------------
(0 行受影響)
--2設置ANSI_NULLS為OFF時,等于 (=) 和不等于 (<>) 比較運算符不遵守 ISO 標準。
SET ANSI_NULLS OFF
GO
SELECT*FROM xmai WHERE id=NULL
SELECT*FROM xmai WHERE id<>NULL
執行結果:
id name
----------- --------------------
NULL XMAI
(1 行受影響)
id name
----------- --------------------
1984 NULL
2009 HJ
2007 MAIHUASHA
(3 行受影響)
--3.使用WHERE column_name<>XYZ_value的SELECT語句返回所有不為XYZ_value也不為NULL的行。
SELECT*FROM xmai WHERE id<>1984
執行結果:
id name
----------- --------------------
2009 HJ
2007 MAIHUASHA
(2 行受影響)