SQL函数总是返回错误的值

时间:2017-01-25 23:53:47

标签: sql constraints sql-server-2016

我正在建立数据库来管理会议,我正在尝试添加约束,以防止两个日期范围重叠。我检查的功能如下:

create function DateOverlapping 
(
    @ConferenceID int,
    @BeginDate date,
    @EndDate date
)
returns bit

as begin

declare @valid bit = 1;


if exists (select * 
            from PaymentsThreshold 
            where ConferenceID = @ConferenceID 
            and @BeginDate < ToDate and @EndDate > FromDate)
begin
    set @valid = 0; 
end 

 return @valid;
 end

然而,即使我正在尝试将记录添加到空表中,这些函数也始终返回0。 任何人都可以帮我解决这个问题吗?

@hatchet我将check constrait添加到PaymentsThreshold表:

alter table dbo.PaymentsThreshold with nocheck add constraint CK_pt_dates_chronology 
check (dbo.DateOverlapping(ConferenceID, FromDate, ToDate) = 1);

然后我试图插入一些数据(到安培表):

insert into PaymentsThreshold values(1, '2017-03-11', '2017-05-11', 0.2)

并导致错误

1 个答案:

答案 0 :(得分:0)

关于为什么总是得到0.在>添加行之后完成约束检查。您只检查刚刚添加的行的重叠,这样可以保证总是得到0,因为行总是重叠。您需要从支票中排除新添加的行。你想要ConferenceId <> @ConferenceId。这样,您可以检查与的任何行重叠,但是您刚刚添加的行。

if exists (select * 
            from PaymentsThreshold 
            where ConferenceID <> @ConferenceID 
            and @BeginDate < ToDate and @EndDate > FromDate)
begin
    set @valid = 0; 
end