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