指定在對空值使用等于 (=) 和不等于 (<>) 比較運算符時,這些運算符的 SQL-92 遵從行為。
SET ANSI_NULLS {ON | OFF}
SQL-92 標準要求對空值的等于 (=) 或不等于 (<>) 比較取值為 FALSE。當 SET ANSI_NULLS 為 ON 時,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 語句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 語句仍返回零行。
當 SET ANSI_NULLS 為 OFF 時,等于 (=) 和不等于 (<>) 比較運算符不遵從 SQL-92 標準。使用 WHERE column_name = NULL 的 SELECT 語句返回 column_name 中含有空值的行。使用 WHERE column_name <> NULL 的 SELECT 語句返回列中含有非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 語句返回所有非 XYZ 值和非 NULL的行。
說明 Microsoft® SQL Server™ 是將空字符串解釋為單個空格還是真正的空字符串,取決于 sp_dbcmptlevel 的兼容級別設置。如果兼容級別小于或等于 65,SQL Server 就將空字符串解釋為單個空格。如果兼容級別等于 70,則 SQL Server 將空字符串解釋為空字符串。有關更多信息,請參見 sp_dbcmptlevel。
當 SET ANSI_NULLS 為 ON 時,所有對空值的比較均取值為 UNKNOWN。當 SET ANSI_NULLS 為 OFF 時,如果數據值是 NULL,則所有數據對空值的比較將取值為 TRUE。如果未指定,則應用當前數據庫的 ANSI nulls 選項的設置。有關 ANSI nulls 數據庫選項的更多信息,請參見 sp_dboption 和設置數據庫選項。
為使腳本按預期運行,不管 ANSI nulls 數據庫選項或 SET ANSI_NULLS 的設置是什么,在可能包含空值的比較中使用 IS NULL 和 IS NOT NULL。
對于存儲過程,SQL Server 使用最初創(chuàng)建存儲過程時的 SET ANSI_NULLS 設置值。無論隨后何時執(zhí)行存儲過程,SET ANSI_NULLS 的設置都還原為其最初使用的值并生效。當在存儲過程內喚醒調用 SET ANSI_NULLS 時,其設置不更改。
在執(zhí)行分布式查詢時應將 SET ANSI_NULLS 設置為 ON。
在計算列或索引視圖上創(chuàng)建或操作索引時,SET ANSI_NULLS 也必須為 ON。如果 SET ANSI_NULLS 為 OFF,計算列或索引視圖上帶索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 語句將失敗。SQL Server 將返回一個錯誤,列出所有違反所需值的 SET 選項。另外,在執(zhí)行 SELECT 語句時,如果 SET ANSI_NULLS 為 OFF,則 SQL Server 將忽略計算列或視圖上的索引值并解析選擇,就好象表或視圖上沒有這樣的索引一樣。
說明 ANSI_NULLS 是在處理計算列或索引視圖上的索引時必須設置為所需值的七個 SET 選項之一。還必須將選項 ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、QUOTED_IDENTIFIER 和 CONCAT_NULL_YIELDS_NULL 設置為 ON,而必須將 NUMERIC_ROUNDABORT 設置為 OFF。
SQL Server ODBC 驅動程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在連接時自動將 ANSI_NULLS 設置為 ON。該設置可以在 ODBC 數據源、ODBC 連接特性或 OLE DB 連接屬性(它們在連接到 SQL Server 之前在應用程序中設置)中進行配置。對來自 DB-Library 應用程序的連接,SET ANSI_NULLS 默認為 OFF。
當 SET ANSI_DEFAULTS 為 ON 時,將啟用 SET ANSI_NULLS。
SET ANSI_NULLS 的設置是在執(zhí)行或運行時設置,而不是在分析時設置。
SET ANSI_NULLS 權限默認授予所有用戶。
下例使用等于 (=) 和不等于 (<>) 比較運算符對表中的 NULL 值和非空值進行比較。下例還顯示 IS NULL 不受 SET ANSI_NULLS 設置的影響。
-- Create table t1 and insert values.
CREATE TABLE t1 (a int null)
INSERT INTO t1 values (NULL)
INSERT INTO t1 values (0)
INSERT INTO t1 values (1)
GO
-- Print message and perform SELECT statements.
PRINT 'Testing default setting'
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname
SELECT *
FROM t1
WHERE a <> @varname
SELECT *
FROM t1
WHERE a IS NULL
GO
-- SET ANSI_NULLS to ON and test.
PRINT 'Testing ANSI_NULLS ON'
SET ANSI_NULLS ON
GO
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname
SELECT *
FROM t1
WHERE a <> @varname
SELECT *
FROM t1
WHERE a IS NULL
GO
-- SET ANSI_NULLS to OFF and test.
PRINT 'Testing SET ANSI_NULLS OFF'
SET ANSI_NULLS OFF
GO
DECLARE @varname int
SELECT @varname = NULL
SELECT *
FROM t1
WHERE a = @varname
SELECT *
FROM t1
WHERE a <> @varname
SELECT *
FROM t1
WHERE a IS NULL
GO
-- Drop table t1.
DROP TABLE t1
GO
相關文章