检查约束 - 在此上下文中不允许子查询

tug*_*erk 7 sql t-sql sql-server constraints sql-server-2008

我厌倦了添加一个Check Constraint,到目前为止我只是失败了.解决这个问题的方法是什么:

Msg 1046,Level 15,State 1,Line 6

在此上下文中不允许子查询.只允许标量表达式.

这是代码:

ALTER TABLE dbo.PropertySeasonDiscount ADD CONSTRAINT
[CC_PropertySeasonDiscount_MadeFrom_MadeTo]
CHECK (
    (SELECT COUNT(PropertySeasonDiscountId) FROM dbo.PropertySeasonDiscounts apsdeb 
        WHERE 
            (apsdeb.PropertySeasonId = PropertySeasonId) AND
            (
                (apsdeb.ValidForReservationsMadeTo >= ValidForReservationsMadeFrom AND ValidForReservationsMadeFrom >= apsdeb.ValidForReservationsMadeFrom) OR
                (apsdeb.ValidForReservationsMadeFrom <= ValidForReservationsMadeTo AND ValidForReservationsMadeTo <= apsdeb.ValidForReservationsMadeTo)
            )
    ) = 0
);
Run Code Online (Sandbox Code Playgroud)

one*_*hen 11

SQL Server当前不支持CHECK CONSTRAINTs的子查询.

正如您所发现的,在尝试绕过子查询限制时,涉及UDF的CHECK约束可能会出现问题.

替代约束实现策略是触发程序嵌入式过程.前者是首选,因为与声明性约束一样,它们不能被规避.

实现一个经过充分优化并处理并发问题的触发式过程策略是非常重要的,但仍然可行.我强烈推荐" 数学专业人员应用数学 "一书作者:Lex de Haan,Toon Koppelaars,第11章(代码示例是Oracle,但可以轻松移植到SQL Server).