1. 程式人生 > >[轉]sql server 的ANSI_NULLS設定

[轉]sql server 的ANSI_NULLS設定

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條

生活中的不便,用軟體解決,學而不用,白學了-----紅馬車