SQL函数总是返回错误的值
我正在创建一个数据库来管理会议,并试图添加一个约束,以防止两个日期范围重叠。我的检查函数如下所示:SQL函数总是返回错误的值,sql,constraints,sql-server-2016,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 PaymentsThresh
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
然后我尝试将一些数据插入到一个ampty表中:
insert into PaymentsThreshold values(1, '2017-03-11', '2017-05-11', 0.2)
这会导致一个错误,关于为什么总是得到0。约束检查在添加行后完成。您只需针对刚才添加的行检查重叠,这将保证您将始终得到0,因为一行始终与自身重叠。您需要从检查中排除新添加的行。你想要ConferenceId@ConferenceId。这样,除了刚才添加的行之外,您可以检查与任何行的重叠
if exists (select *
from PaymentsThreshold
where ConferenceID <> @ConferenceID
and @BeginDate < ToDate and @EndDate > FromDate)
begin
set @valid = 0;
end
是否可能在添加行后调用此函数?这可以解释为什么总是得到0。这个函数是如何被调用的?注意:SQL中没有@。可能正在使用一些类似SQL的产品?->>请将您的DBMS添加到标记中。我使用的是Microsoft SQL Server Management Studio 2016。我很想知道为什么在提出问题一个月后,投票被否决,而这个答案被接受了。
if exists (select *
from PaymentsThreshold
where ConferenceID <> @ConferenceID
and @BeginDate < ToDate and @EndDate > FromDate)
begin
set @valid = 0;
end