当 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条
生活中的不便,用软件解决,学而不用,白学了-----红马車