指定在對(duì)空值使用等于 (=) 和不等于 (<>) 比較運(yùn)算符時(shí),這些運(yùn)算符的 SQL-92 遵從行為。
SET ANSI_NULLS {ON | OFF}
SQL-92 標(biāo)準(zhǔn)要求對(duì)空值的等于 (=) 或不等于 (<>) 比較取值為 FALSE。當(dāng) SET ANSI_NULLS 為 ON 時(shí),即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 語(yǔ)句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 語(yǔ)句仍返回零行。
當(dāng) SET ANSI_NULLS 為 OFF 時(shí),等于 (=) 和不等于 (<>) 比較運(yùn)算符不遵從 SQL-92 標(biāo)準(zhǔn)。使用 WHERE column_name = NULL 的 SELECT 語(yǔ)句返回 column_name 中含有空值的行。使用 WHERE column_name <> NULL 的 SELECT 語(yǔ)句返回列中含有非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 語(yǔ)句返回所有非 XYZ 值和非 NULL的行。
說(shuō)明 Microsoft® SQL Server™ 是將空字符串解釋為單個(gè)空格還是真正的空字符串,取決于 sp_dbcmptlevel 的兼容級(jí)別設(shè)置。如果兼容級(jí)別小于或等于 65,SQL Server 就將空字符串解釋為單個(gè)空格。如果兼容級(jí)別等于 70,則 SQL Server 將空字符串解釋為空字符串。有關(guān)更多信息,請(qǐng)參見(jiàn) sp_dbcmptlevel。
當(dāng) SET ANSI_NULLS 為 ON 時(shí),所有對(duì)空值的比較均取值為 UNKNOWN。當(dāng) SET ANSI_NULLS 為 OFF 時(shí),如果數(shù)據(jù)值是 NULL,則所有數(shù)據(jù)對(duì)空值的比較將取值為 TRUE。如果未指定,則應(yīng)用當(dāng)前數(shù)據(jù)庫(kù)的 ANSI nulls 選項(xiàng)的設(shè)置。有關(guān) ANSI nulls 數(shù)據(jù)庫(kù)選項(xiàng)的更多信息,請(qǐng)參見(jiàn) sp_dboption 和設(shè)置數(shù)據(jù)庫(kù)選項(xiàng)。
為使腳本按預(yù)期運(yùn)行,不管 ANSI nulls 數(shù)據(jù)庫(kù)選項(xiàng)或 SET ANSI_NULLS 的設(shè)置是什么,在可能包含空值的比較中使用 IS NULL 和 IS NOT NULL。
對(duì)于存儲(chǔ)過(guò)程,SQL Server 使用最初創(chuàng)建存儲(chǔ)過(guò)程時(shí)的 SET ANSI_NULLS 設(shè)置值。無(wú)論隨后何時(shí)執(zhí)行存儲(chǔ)過(guò)程,SET ANSI_NULLS 的設(shè)置都還原為其最初使用的值并生效。當(dāng)在存儲(chǔ)過(guò)程內(nèi)喚醒調(diào)用 SET ANSI_NULLS 時(shí),其設(shè)置不更改。
在執(zhí)行分布式查詢時(shí)應(yīng)將 SET ANSI_NULLS 設(shè)置為 ON。
在計(jì)算列或索引視圖上創(chuàng)建或操作索引時(shí),SET ANSI_NULLS 也必須為 ON。如果 SET ANSI_NULLS 為 OFF,計(jì)算列或索引視圖上帶索引的表上的 CREATE、UPDATE、INSERT 和 DELETE 語(yǔ)句將失敗。SQL Server 將返回一個(gè)錯(cuò)誤,列出所有違反所需值的 SET 選項(xiàng)。另外,在執(zhí)行 SELECT 語(yǔ)句時(shí),如果 SET ANSI_NULLS 為 OFF,則 SQL Server 將忽略計(jì)算列或視圖上的索引值并解析選擇,就好象表或視圖上沒(méi)有這樣的索引一樣。
說(shuō)明 ANSI_NULLS 是在處理計(jì)算列或索引視圖上的索引時(shí)必須設(shè)置為所需值的七個(gè) SET 選項(xiàng)之一。還必須將選項(xiàng) ANSI_PADDING、ANSI_WARNINGS、ARITHABORT、QUOTED_IDENTIFIER 和 CONCAT_NULL_YIELDS_NULL 設(shè)置為 ON,而必須將 NUMERIC_ROUNDABORT 設(shè)置為 OFF。
SQL Server ODBC 驅(qū)動(dòng)程序和用于 SQL Server 的 Microsoft OLE DB 提供程序在連接時(shí)自動(dòng)將 ANSI_NULLS 設(shè)置為 ON。該設(shè)置可以在 ODBC 數(shù)據(jù)源、ODBC 連接特性或 OLE DB 連接屬性(它們?cè)谶B接到 SQL Server 之前在應(yīng)用程序中設(shè)置)中進(jìn)行配置。對(duì)來(lái)自 DB-Library 應(yīng)用程序的連接,SET ANSI_NULLS 默認(rèn)為 OFF。
當(dāng) SET ANSI_DEFAULTS 為 ON 時(shí),將啟用 SET ANSI_NULLS。
SET ANSI_NULLS 的設(shè)置是在執(zhí)行或運(yùn)行時(shí)設(shè)置,而不是在分析時(shí)設(shè)置。
SET ANSI_NULLS 權(quán)限默認(rèn)授予所有用戶。
下例使用等于 (=) 和不等于 (<>) 比較運(yùn)算符對(duì)表中的 NULL 值和非空值進(jìn)行比較。下例還顯示 IS NULL 不受 SET ANSI_NULLS 設(shè)置的影響。
-- 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
相關(guān)文章