为什么要将SQL日期变量与null进行比较?

为什么要将SQL日期变量与null进行比较?,sql,sql-server,sql-server-2008,stored-procedures,Sql,Sql Server,Sql Server 2008,Stored Procedures,我刚刚在用SQL编写的过程中遇到了一个有趣的问题 在我的程序中,我有两个日期,它们是可选的参数,默认为NULL,我想检查这些参数是否为NULL,如果不是我程序的运行部分,如果它们为NULL,则忽略程序的额外部分 我做了一个相当基本的IF(@dateVariable NULL和@DateVariable2 NULL)语句,但是IF语句永远不会工作,即使变量不为NULL,我假设SQL正在努力将日期与NULL进行比较,这很奇怪,因为datetime可以为NULL 为了解决这个问题,我刚刚做了IF(Da

我刚刚在用SQL编写的过程中遇到了一个有趣的问题

在我的程序中,我有两个日期,它们是可选的参数,默认为NULL,我想检查这些参数是否为NULL,如果不是我程序的运行部分,如果它们为NULL,则忽略程序的额外部分

我做了一个相当基本的
IF(@dateVariable NULL和@DateVariable2 NULL)
语句,但是IF语句永远不会工作,即使变量不为NULL,我假设SQL正在努力将日期与NULL进行比较,这很奇怪,因为datetime可以为NULL

为了解决这个问题,我刚刚做了
IF(DateVariable不为NULL)
,它工作正常。我还尝试了
IF(ISNULL(@DateVariable,)“”)
,它也可以正常工作

所以我的问题是,为什么第一个IF不起作用,但是第二个和第三个IF都起作用,因为它们都必须在某个点上比较变量的内容是否为null

例如:

-----失败-----

DECLARE@Date-DATETIME
设置@Date=当前时间戳
如果(@Date NULL)
开始
打印('a')
结束
-----工作-----

DECLARE@Date-DATETIME
设置@Date=当前时间戳
如果(ISNULL(@Date,)“”)
开始
打印('a')
结束
声明@Date-DATETIME
设置@Date=当前时间戳
如果(@Date不为空)
开始
打印('a')
结束

简单地说,“NULL”不等于“NULL”“空”与不确定状态相当,其中一个不确定的事物不一定等于另一个也不确定的事物。测试空值时,请使用“IS NULL”、“ISNULL()”或“COALESCE()”。将ANSI_null设置为“off”可以更改此行为,但这不是ANSI SQL标准。有关更多信息,请参阅

比较空值时必须小心。政府的行为 比较取决于SET ANSI_NULLS选项的设置

启用“设置ANSI_NULLS”时,一种比较,其中一个或多个 表达式为NULL不会产生TRUE或FALSE;它产生 不知道。这是因为无法比较未知的值 逻辑上与任何其他值相反。如果表达式 与文本NULL进行比较,或者如果比较两个表达式 其中一个计算结果为NULL


请参见

NULL
视为
未知值
@Date=未知值
应该产生什么结果<代码>真值<代码>错误?或者
我们不知道
不推荐将ANSI_NULLS设置为OFF。
DECLARE @Date DATETIME
SET @Date = CURRENT_TIMESTAMP

IF (@Date <> NULL)
BEGIN
    print('a')
END
DECLARE @Date DATETIME
SET @Date = CURRENT_TIMESTAMP

IF (ISNULL(@Date,'') <> '')
BEGIN
    print('a')
END

DECLARE @Date DATETIME
SET @Date = CURRENT_TIMESTAMP

IF (@Date IS NOT NULL)
BEGIN
    print('a')
END