检查约束以确认 Exactly One 不为 NULL

Check Constraint to Confirm Exactly One is not NULL

我有一个包含 CompaniesIdHotelsId 列的 table。我想编写一个检查约束来确认其中一列为空而另一列不是。

我尝试了以下表达式:

(CompaniesId is null) <> (HotelsId is null)

当我尝试将其保存在 SSMS 的“检查约束”对话框中时,我收到了有用的消息:

Error validating constraint 'CK_CostingLineItemVendors'.

有人可以帮我修改语法吗?

编辑:

根据文章IS [NOT] NULL (Transact-SQL)IS NULLIS NOT NULL的结果是Boolean。这就是为什么我假设我可以比较这些结果是否相等。

这个有效:

   (CompaniesId is null AND HotelsId is not null) 
OR (CompaniesId is not null AND HotelsId is null)

T-SQL 没有可用的布尔类型。您不能拥有一个具有布尔类型的表达式并期望像使用任何其他表达式一样使用它。 T-SQL 中看似可以使用布尔表达式(如 WHERE)的所有位置都是语法中的硬编码位置。 (是的,这是没有具体原因的缺陷。)

简单的滥用一个bit或者一个int作为bool:

IIF(CompaniesId is null, 1, 0) <> IIF(HotelsId is null, 1, 0)

IIF 是一个内部函数,它可以像 CASE 一样将条件作为第一个参数。你不能自己定义这样的函数。