SQL Server CHECK CONSTRAINT语法错误排查及正确实现咨询
SQL Server CHECK CONSTRAINT语法错误排查及正确实现咨询
兄弟我太懂你这种逻辑看着没问题但约束就是不生效还报错的崩溃感了!先给你说清楚为啥你写的CASE表达式不行,再给你正确的写法。
问题根源:CASE表达式不适合直接作为CHECK约束的条件
SQL Server的CHECK约束要求整个表达式最终返回布尔值(TRUE/FALSE),但你用的CASE语句本质是返回一个标量值——比如当Logical_Value=0时,CASE返回的是Int_Value <5000这个判断的结果,但这个结果会被隐式转换成其他类型(比如bit),数据库没法把它当作约束的布尔条件来解析,所以SSMS会报错,而且约束根本起不到验证作用。
正确的写法:用逻辑运算符组合条件
直接用AND/OR把不同分支的逻辑组合起来,让整个表达式最终是一个明确的布尔判断,数据库就能正确解析了:
CHECK ( -- 对应Logical_Value=0的情况 (Logical_Value = 0 AND Int_Value < 5000) -- 对应Logical_Value=1的情况(猜你要的是5000到9999之间对吧) OR (Logical_Value = 1 AND Int_Value BETWEEN 5000 AND 9999) -- 对应Logical_Value=2的情况 OR (Logical_Value = 2 AND Int_Value > 9999) -- 顺便把Logical_Value的范围约束也加上,更严谨 AND Logical_Value BETWEEN 0 AND 2 )
额外说明
如果你之前已经单独给Logical_Value加了BETWEEN 0 AND 2的约束,那上面的AND Logical_Value BETWEEN 0 AND 2可以去掉,但合并在一起写能让约束更集中,避免遗漏。
这样写的话,数据库会逐一判断每个分支的条件,只有当某个分支完全满足时,约束才会通过,就能严格限制Int_Value和Logical_Value的对应关系了。
备注:内容来源于stack exchange,提问作者mat.viguier
相关产品推荐
相关产品推荐

