是否需要SQL Server的双重检查?

0 sql-server sql-server-2008

IF @insertedValue IS NOT NULL AND @insertedValue >  0 
Run Code Online (Sandbox Code Playgroud)

这个逻辑处于触发状态.

该值来自已删除或插入的行(无关紧要).

2个问题:

  1. 我需要检查这两个条件吗?(我希望所有值> 0,db中的值可以为空)

  2. SQL Server是否按照我编写的顺序检查表达式?

Dav*_*d M 5

1)实际上,不,因为如果@insertedValue为NULL,则表达式@insertedValue> 0将变为false.(实际上,正如马丁史密斯在他的评论中指出的那样,它会评估一个特殊的值"未知",当它被迫自己的布尔结果崩溃为假 - 例子:unknown AND true = unknown这被迫为假,unknown OR true = true.)但是你'依赖于NULL值的比较行为.单步等效方法BTW将是:

IF ISNULL(@insertedValue, 0) > 0
Run Code Online (Sandbox Code Playgroud)

恕我直言,如果没有别的,你最好坚持使用明确的NULL检查.

2)由于查询将在执行前进行优化,因此绝对不能保证AND操作员的执行顺序或短路.

将两者结合起来 - 如果双重检查确实是不必要的,那么无论如何它都可能在执行之前进行优化,但是如果你明确地说明你的SQL代码在我的视图中将更易于维护.