共用方式為


SET ANSI_NULLS (Transact-SQL)

適用於:SQL Server Azure SQL 資料庫 Azure SQL 受控執行個體Azure Synapse AnalyticsAnalytics Platform System (PDW)

在 SQL Server 中搭配=值使用時,指定 Equals (<>) 和 Not Equal To (NULL) 比較運算子的 ISO 相容行為。

  • SET ANSI_NULLS ON - 評估 {expression} = NULL{expression} <> NULL ,如同 False 的值 {expression}NULL。 此行為符合 ANSI 規範。
  • SET ANSI_NULLS OFF - 評估 {expression} = NULLTrue{expression} <> NULL ,如同 False 的值 {expression}NULL。 不建議使用此行為,因為 NULL 不應該使用 =<> 運算符來比較值。

注意

SET ANSI_NULLS OFF ANSI_NULLS OFF和資料庫選項已被取代。 從 SQL Server 2017 (14.x) 開始,ANSI_NULLS一律設定為 ON。 已被取代的功能不應在新應用程式中使用。 如需詳細資訊,請參閱 SQL Server 2017 中已被取代 資料庫引擎 功能。

Transact-SQL 語法慣例

語法

Azure Synapse Analytics 中的 SQL Server 無伺服器 SQL 集區語法,Microsoft Fabric

SET ANSI_NULLS { ON | OFF }

Azure Synapse Analytics 和 Analytics Platform System (PDW) 的語法

SET ANSI_NULLS ON

備註

當 為 ON 時ANSI_NULLS,使用 SELECT 的語句會傳回零個WHERE column_name = NULL數據列,即使column_name中有 NULL 值也一樣。 即使SELECTWHERE column_name <> NULL中有非 NULL 值,使用 的語句仍會傳回零個數據列。

當ANSI_NULLS為 OFF 時,Equals (=) 和 Not Equal To (<>) 比較運算符不會遵循 ISO 標準。 使用 的語句會傳回SELECT中具有 null 值的資料列。WHERE column_name = NULL SELECT使用 WHERE column_name <> NULL 的語句會傳回數據行中具有非NULL值的數據列。 此外, SELECT 使用 WHERE column_name <> XYZ_value 的語句會傳回未 XYZ_value 且不是 NULL的所有數據列。

當 為 ON 時 ANSI_NULLS ,針對 Null 值的所有比較都會評估為 UNKNOWN。 當 為 OFF 時 SET ANSI_NULLS ,如果數據值為 ,則所有數據與 Null 值的比較會評估為 NULLTRUE。 如果未 SET ANSI_NULLS 指定,則會套用目前資料庫之 選項的設定 ANSI_NULLS 。 如需資料庫選項的詳細資訊 ANSI_NULLS ,請參閱 ALTER DATABASE (Transact-SQL)

下表顯示 的設定 ANSI_NULLS 如何使用 Null 和非 Null 值影響布爾表達式的結果。

布林運算式 將 ANSI_NULLS 設置為 ON 將 ANSI_NULLS 設置為 OFF
NULL = NULL 未知 true
1 = NULL 未知 錯誤
NULL <> NULL 未知 錯誤
1 <> NULL 未知 true
NULL > NULL 未知 未知
1 > NULL 未知 未知
NULL IS NULL true true
1 IS NULL 錯誤 錯誤
NULL IS NOT NULL 錯誤 錯誤
1 IS NOT NULL true true

SET ANSI_NULLS ON只有在比較的其中一個作數是 或常值 NULL的變數NULL時,才會影響比較。 如果比較的兩端是資料行或複合運算式,設定就不會影響比較。

若要讓腳本如預期般運作,不論 ANSI_NULLS 資料庫選項或的設定 SET ANSI_NULLS為何,請使用 IS NULLIS NOT NULL 來比較可能包含 Null 值。

ANSI_NULLS 應該設定為 ON 來執行分散式查詢。

ANSI_NULLS 當您在計算數據行或索引檢視表上建立或變更索引時,也必須是 ON。 如果 SET ANSI_NULLS 為 OFF,則計算資料行或索引檢視表上具有索引之數據表上的任何CREATEUPDATEINSERT、 和 DELETE 語句都會失敗。 SQL Server 會傳回錯誤,列出違反必要值的所有 SET 選項。 此外,當您執行 SELECT 語句時,如果 SET ANSI_NULLS 為 OFF,SQL Server 會忽略計算數據行或檢視表上的索引值,並解析選取作業,就像數據表或檢視表上沒有這類索引一樣。

注意

ANSI_NULLS 是處理計算數據行或索引檢視表索引時,必須設定為必要值的七個SET選項之一。 ANSI_PADDINGANSI_WARNINGSARITHABORTQUOTED_IDENTIFIERCONCAT_NULL_YIELDS_NULL 選項也必須設定為 ON,而 NUMERIC_ROUNDABORT 必須設定為 OFF。

連接時,SQL Server Native Client ODBC 驅動程式和 SQL Server Native Client OLE DB Provider for SQL Server 會自動設定 ANSI_NULLS 為 ON。 您可以在 ODBC 資料來源、ODBC 連線屬性中設定這項設定,或在應用程式連線到 SQL Server 執行個體之前所設定的 OLE DB 連線屬性中設定這項設定。 的預設值 SET ANSI_NULLS 為 OFF。

ANSI_DEFAULTS 為 ON 時, ANSI_NULLS 會啟用 。

的設定 ANSI_NULLS 是在執行或運行時間定義,而不是在剖析時間定義。

若要檢視此設定的目前設定,請執行下列查詢:

DECLARE @ANSI_NULLS VARCHAR(3) = 'OFF';  
IF ( (32 & @@OPTIONS) = 32 ) SET @ANSI_NULLS = 'ON';  
SELECT @ANSI_NULLS AS ANSI_NULLS;   

權限

需要 public 角色的成員資格。

範例

下列範例使用 Equals (=) 和 Not Equal To (<>) 比較運算符來比較 NULL0null 變數中的值。

SET ANSI_NULLS OFF
DECLARE @var INT = NULL
SELECT
    IIF(@var = NULL,  'True', 'False') as EqualNull,
    IIF(@var <> NULL, 'True', 'False') as DifferentNull,
    IIF(@var = 0,     'True', 'False') as EqualZero,
    IIF(@var <> 0,    'True', 'False') as DifferentZero

下表顯示結果。

等於 Null DifferentNull EqualZero (等於零) 差零

所有 SET ANSI_NULLS ON 表達式都會評估為 『False』,因為 NULL 無法與 NULL0 使用這些運算符進行比較。

下列範例會使用等於 (=) 和不等於 (<>) 比較運算子,與資料表中的 NULL 和非 Null 值比較。 這個範例也會顯示 SET ANSI_NULLS 設定不會影響 IS NULL

-- Create table t1 and insert values.  
CREATE TABLE dbo.t1 (a INT NULL);  
INSERT INTO dbo.t1 values (NULL),(0),(1);  
GO  
  
-- Print message and perform SELECT statements.  
PRINT 'Testing default setting';  
DECLARE @varname int;   
SET @varname = NULL;  
  
SELECT a  
FROM t1   
WHERE a = @varname;  
  
SELECT a   
FROM t1   
WHERE a <> @varname;  
  
SELECT a   
FROM t1   
WHERE a IS NULL;  
GO 

現在將 ANSI_NULLS 設為 ON 並測試。

PRINT 'Testing ANSI_NULLS ON';  
SET ANSI_NULLS ON;  
GO  
DECLARE @varname int;  
SET @varname = NULL  
  
SELECT a   
FROM t1   
WHERE a = @varname;  
  
SELECT a   
FROM t1   
WHERE a <> @varname;  
  
SELECT a   
FROM t1   
WHERE a IS NULL;  
GO  

現在將 ANSI_NULLS 設為 OFF 並測試。

PRINT 'Testing ANSI_NULLS OFF';  
SET ANSI_NULLS OFF;  
GO  
DECLARE @varname int;  
SET @varname = NULL;  
SELECT a   
FROM t1   
WHERE a = @varname;  
  
SELECT a   
FROM t1   
WHERE a <> @varname;  
  
SELECT a   
FROM t1   
WHERE a IS NULL;  
GO  
  
-- Drop table t1.  
DROP TABLE dbo.t1;