检查约束未按照sql server中定义的条件工作

检查约束未按照sql server中定义的条件工作,sql,sql-server,Sql,Sql Server,我有一个表aaid int、sdate date、edate date、约束chk checksdate=edate或@edate sdate,然后不允许插入 如果@id,则允许插入 我已经将上述逻辑封装在一个函数中,并在check约束中使用了该函数。函数工作正常,但检查约束不允许我输入任何记录。我不知道为什么-我的功能和约束如下所述: alter function fn_aa(@id int,@sdate date,@edate date) returns int as begin decla

我有一个表aaid int、sdate date、edate date、约束chk checksdate=edate或@edate sdate,然后不允许插入

如果@id,则允许插入

我已经将上述逻辑封装在一个函数中,并在check约束中使用了该函数。函数工作正常,但检查约束不允许我输入任何记录。我不知道为什么-我的功能和约束如下所述:

alter function fn_aa(@id int,@sdate date,@edate date)
returns int
as
begin
declare @i int
if exists (select * from aa where id = @id and (@sdate >= edate or @edate <= sdate)) or not exists(select * from aa where id = @id)
begin
set @i = 1
end
if exists(select * from aa where id = @id and (@sdate < edate or @edate < sdate)) 
begin
set @i = 0
end
return @i
end

go

alter table aa
add constraint aa_ck check(dbo.fn_aa(id,sdate,edate) = 1)
现在,当我尝试在表aa中插入任何值时,我得到以下错误-

Msg 547,16级,状态0,第1行 INSERT语句与CHECK约束aa_ck冲突。数据库tempdb表dbo.aa中发生冲突。 声明已终止

函数返回值1,但约束不允许插入数据。有人能帮我吗。我试了两个小时,但不明白我做错了什么


-我认为你的逻辑是错误的。两行重叠

alter function fn_aa(@id int,@sdate date,@edate date)
returns int
as
begin
    if exists (select *
               from aa
               where id = @id and
                     @sdate < edate and @edate > sdate
              )
    begin
        return 0;
    end;
    return 1;
end;

当以下任一条件为真时,您的版本将返回1:@sdate>=edate或@edate同位语。。我忘记添加另一个检查约束来检查startdate