我有一个包含CompaniesId
和HotelsId
列的表格。我想写一个检查约束,确认其中一列是空的而另一列不是。
我尝试了以下表达式:
(CompaniesId is null) <> (HotelsId is null)
当我尝试在SSMS的Check Constraints对话框中保存时,我收到了有用的消息:
验证约束'CK_CostingLineItemVendors'时出错。
有人可以用我的语法帮助我吗?
修改
根据文章IS [NOT] NULL (Transact-SQL),IS NULL
或IS NOT NULL
的结果为Boolean
。这就是为什么我认为我可以比较这些结果的平等。
答案 0 :(得分:3)
T-SQL没有可用的布尔类型。您不能拥有一个具有布尔类型的表达式,并且希望像任何其他表达式一样使用它。你似乎可以使用布尔表达式(如WHERE
)的T-SQL中的所有位置都是语法中的硬编码位置。 (是的,这是一个没有特殊原因的缺陷。)
只是滥用一点或int作为布尔:
IIF(CompaniesId is null, 1, 0) <> IIF(HotelsId is null, 1, 0)
IIF
是一个内在函数,它可以将条件作为CASE
之类的第一个参数。你不能自己定义这样的功能。
答案 1 :(得分:2)
这有效:
(CompaniesId is null AND HotelsId is not null)
OR (CompaniesId is not null AND HotelsId is null)