[轉]sql server 的ANSI_NULLS設定
當 SET ANSI_NULLS 為 ON 時,表示SQL語句遵循SQL-92標準。當 SET ANSI_NULLS 為 OFF 時,表示不遵從 SQL-92 標準。
SQL-92 標準要求對空值(NULL)的等於 (=) 或不等於 (<>) 比較取值都為 FALSE,即對所有欄位的進行操作:= NULL 或者 <>NULL,返回的都是false。如果用這2個條件進行查詢都將查詢不到任何的資料。即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 語句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 語句仍返回零行。
此外,使用 WHERE column_name <> XYZ_value 的 SELECT 語句返回所有非 XYZ 值和非 NULL的行。為使指令碼按預期執行,不管 ANSI nulls 資料庫選項或 SET ANSI_NULLS 的設定是什麼,在可能包含空值的比較中使用 IS NULL 和 IS NOT NULL。
庫表:
[id] [int] IDENTITY(1,1) NOT NULL,
[value] [varchar](50) NULL,
[mark] [varchar](50) NULL,
資料:
INSERT INTO [FinanceStock].[dbo].[Table_Test]
([value])
VALUES
(''),(' '),('v'),(NULL)
語句1:
set ANSI_NULLS ON
GO
SELECT [id]
,[value]
FROM [FinanceStock].[dbo].[Table_Test]
WHERE [value] <> NULL
GO
結果為空
語句2:
set ANSI_NULLS ON
GO
SELECT [id]
,[value]
FROM [FinanceStock].[dbo].[Table_Test]
WHERE [value] = NULL
GO
結果為空
語句3:
set ANSI_NULLS OFF
GO
SELECT [id]
,[value]
FROM [FinanceStock].[dbo].[Table_Test]
WHERE [value] <> NULL
GO
符合條件的記錄3條
語句4:
set ANSI_NULLS OFF
GO
SELECT [id]
,[value]
FROM [FinanceStock].[dbo].[Table_Test]
WHERE [value] = NULL
GO
符合條件的記錄1條
語句5:
set ANSI_NULLS OFF
GO
SELECT [id]
,[value]
FROM [FinanceStock].[dbo].[Table_Test]
WHERE [value] <> 'V'
GO
符合條件的記錄2條
生活中的不便,用軟體解決,學而不用,白學了-----紅馬車