Sql server 是SQL Server';这里需要再检查一遍吗?
这个逻辑在触发器中 该值来自已删除或插入的行(无所谓) 2个问题:Sql server 是SQL Server';这里需要再检查一遍吗?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,这个逻辑在触发器中 该值来自已删除或插入的行(无所谓) 2个问题: 我需要检查这两种情况吗?(我希望所有值都大于0,db中的值可以为空) SQL Server是否检查我编写的顺序中的表达式 1) 实际上,不是,因为如果@insertedValue为NULL,表达式@insertedValue>0将计算为false。(实际上,正如Martin Smith在他的评论中指出的那样,它将计算为一个特殊的值“未知”,当强制为布尔结果时,它自身将崩溃为false-例如:unknown和true=unknow
unknown和true=unknown
,它被强制为false、unknown或true=true
),但您依赖于空值的比较行为。顺便说一句,单步等效方法为:
IF @insertedValue IS NOT NULL AND @insertedValue > 0
IMHO,如果没有其他内容,为了清晰起见,最好还是坚持使用显式空检查
2) 由于查询将在执行前进行优化,因此绝对不能保证执行顺序或和运算符短路
将二者结合起来-如果确实不需要双重检查,那么在执行之前可能会对其进行优化,但在我看来,如果您明确这一点,您的SQL代码将更易于维护。1)事实上,不是,因为如果@insertedValue为NULL,表达式@insertedValue>0将计算为false。(实际上,正如Martin Smith在他的评论中指出的那样,它将计算为一个特殊的值“未知”,当强制为布尔结果时,它自身将崩溃为false-例如:unknown和true=unknown
,它被强制为false、unknown或true=true
),但您依赖于空值的比较行为。顺便说一句,单步等效方法为:
IF @insertedValue IS NOT NULL AND @insertedValue > 0
IMHO,如果没有其他内容,为了清晰起见,最好还是坚持使用显式空检查
2) 由于查询将在执行前进行优化,因此绝对不能保证执行顺序或和运算符短路
将二者结合起来-如果确实不需要双重检查,那么在执行之前可能会对其进行优化,但在我看来,如果您明确这一点,您的SQL代码将更易于维护。您可以使用=>返回其参数中的第一个非空表达式。
现在,您可以通过增加列限制使查询更加灵活,并且再次需要检查大于零的条件。这里需要注意的重要一点是,您可以选择检查多列中的值
IF ISNULL(@insertedValue, 0) > 0
您可以使用=>返回其参数中的第一个非空表达式。
现在,您可以通过增加列限制使查询更加灵活,并且再次需要检查大于零的条件。这里需要注意的重要一点是,您可以选择检查多列中的值
IF ISNULL(@insertedValue, 0) > 0
依赖于空值的比较行为
。。。比较能得出不同的结果吗?你能粘贴一个小例子吗?在这方面,使用>或运算符,你会让其他可能来维护你的代码的人挠头,不得不问同样的问题……@insertedValue>0
计算结果为未知
非假。SQL使用三值逻辑。+1尽管仍然不太正确unknown+true=unknown
。3VL真值表。在where子句中,谓词的计算结果必须为true
。在检查约束中,条件的计算结果不得为false
(即为真或未知)多任务。。。你不讨厌它吗感谢依赖于空值的比较行为
。。。比较能得出不同的结果吗?你能粘贴一个小例子吗?在这方面,使用>或运算符,你会让其他可能来维护你的代码的人挠头,不得不问同样的问题……@insertedValue>0
计算结果为未知
非假。SQL使用三值逻辑。+1尽管仍然不太正确unknown+true=unknown
。3VL真值表。在where子句中,谓词的计算结果必须为true
。在检查约束中,条件的计算结果不得为false
(即为真或未知)多任务。。。你不讨厌它吗谢谢