適用於:SQL Server
Azure SQL 資料庫
Azure SQL 受控執行個體
Azure Synapse Analytics
Analytics 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} = NULL
為True
和{expression} <> NULL
,如同False
的值{expression}
為NULL
。 不建議使用此行為,因為NULL
不應該使用=
和<>
運算符來比較值。
注意
SET ANSI_NULLS OFF
ANSI_NULLS OFF
和資料庫選項已被取代。 從 SQL Server 2017 (14.x) 開始,ANSI_NULLS一律設定為 ON。 已被取代的功能不應在新應用程式中使用。 如需詳細資訊,請參閱 SQL Server 2017 中已被取代 資料庫引擎 功能。
語法
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 值也一樣。 即使SELECT
WHERE 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 值的比較會評估為 NULL
TRUE。 如果未 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 NULL
和 IS NOT NULL
來比較可能包含 Null 值。
ANSI_NULLS
應該設定為 ON 來執行分散式查詢。
ANSI_NULLS
當您在計算數據行或索引檢視表上建立或變更索引時,也必須是 ON。 如果 SET ANSI_NULLS 為 OFF,則計算資料行或索引檢視表上具有索引之數據表上的任何CREATE
、 UPDATE
INSERT
、 和 DELETE
語句都會失敗。 SQL Server 會傳回錯誤,列出違反必要值的所有 SET 選項。 此外,當您執行 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 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 (<>
) 比較運算符來比較 NULL
或 0
和 null
變數中的值。
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
無法與 NULL
或 0
使用這些運算符進行比較。
下列範例會使用等於 (=
) 和不等於 (<>
) 比較運算子,與資料表中的 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;