简单检查约束未在INFORMATION_SCHEMA.CHECK_CONSTRAINTS中正确显示

时间:2012-03-14 21:22:38

标签: sql-server sql-server-2005 tsql constraints

我有一个相当简单的检查约束,我想强制两列既是NULL又是NOT NULL。但是INFORMATION_SCHEMA.CHECK_CONSTRAINTS未正确显示此约束。

我基本上想要这个约束:

 ((Col1 IS NULL AND Col2 IS NULL) OR (Col1 IS NOT NULL AND Col2 IS NOT NULL))

INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSE显示了这一点:

 ([Col1] IS NULL AND [Col2] IS NULL OR [Col1] IS NOT NULL AND [Col2] IS NOT NULL)
--^                                ^  ^                                        ^
--missing parenthesis 

不一样且不正确。

您可以轻松复制此内容......

创建表并检查约束:

CREATE TABLE dbo.MyTest (RowID int identity(1,1) primary key, Col1 int NULL, Col2 int NULL)
ALTER TABLE dbo.MyTest ADD CONSTRAINT CK_MyTest_Cols CHECK ((Col1 IS NULL AND Col2 IS NULL) OR (Col1 IS NOT NULL AND Col2 IS NOT NULL))

显示不正确的INFORMATION_SCHEMA.CHECK_CONSTRAINTS.CHECK_CLAUSE

SELECT
     c.ORDINAL_POSITION
        ,cc.CONSTRAINT_NAME
        ,cc.CHECK_CLAUSE
    FROM INFORMATION_SCHEMA.COLUMNS                                  c
        LEFT OUTER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE   cu ON c.TABLE_CATALOG=cu.TABLE_CATALOG AND c.TABLE_SCHEMA=cu.TABLE_SCHEMA AND c.TABLE_NAME=cu.TABLE_NAME AND c.COLUMN_NAME=cu.COLUMN_NAME
        LEFT OUTER JOIN INFORMATION_SCHEMA.CHECK_CONSTRAINTS         cc ON cu.TABLE_CATALOG=cc.CONSTRAINT_CATALOG AND cu.TABLE_SCHEMA=cc.CONSTRAINT_SCHEMA AND cu.CONSTRAINT_NAME=cc.CONSTRAINT_NAME
    WHERE c.TABLE_SCHEMA='dbo' AND c.TABLE_Name='MyTest' AND cc.CONSTRAINT_SCHEMA IS NOT NULL

验证检查约束实际上是否正常工作:

INSERT INTO dbo.MyTest (Col1, Col2) VALUES (NULL,NULL)
INSERT INTO dbo.MyTest (Col1, Col2) VALUES (5,5)
INSERT INTO dbo.MyTest (Col1, Col2) VALUES (5,NULL)

INFORMATION_SCHEMA.CHECK_CONSTRAINTS的内容是什么?并且有什么我做错了或为此做任何解决方法吗?

当使用check constraints duologue框(设计表格时)时,SSMS也会错误地显示它。它也会错误地编写脚本。但是,当我使用此约束的SSMS脚本时,我的测试中的三个插入(上面)仍然可以按预期工作(前两个插入工作,第三个插入失败)?这似乎与我从ANDORparenthesis学到的所有内容相悖。发生了什么事?

1 个答案:

答案 0 :(得分:2)

他们是一样的。见Logical Operator Precedence

  

如果在语句中使用了多个逻辑运算符,则为NOT   首先评估,然后评估AND,最后评估OR。

And的优先级高于OR,因此括号是可选的 - 与乘法的优先级高于加法相同,所以

SELECT 1 * 1 + 3 * 3 

相同
SELECT (1 * 1) + (3 * 3)