Sql server 函数在查询中工作,但不受约束

Sql server 函数在查询中工作,但不受约束,sql-server,tsql,Sql Server,Tsql,我有以下问题:我有一个酒店的数据库,我必须在预订房间时处理碰撞 比如说,Quest1想在2016-11-10和2016-11-15之间预订房间2,但是Quest3在2016-11-07和2016-11-14之间已经预订了这个房间。你可以从人们离开的那天起预订房间,我的函数应该被调用,告诉他不能在这些日期预订 我有一张空桌子可以预订。问题是,在查询中使用该函数时,它返回room2在2016-11-10和2016-11-15之间被预订了0次,因为表是空的。即使它不是空的,它也会返回正确的值,对它进行

我有以下问题:我有一个酒店的数据库,我必须在预订房间时处理碰撞

比如说,Quest1想在2016-11-10和2016-11-15之间预订房间2,但是Quest3在2016-11-07和2016-11-14之间已经预订了这个房间。你可以从人们离开的那天起预订房间,我的函数应该被调用,告诉他不能在这些日期预订

我有一张空桌子可以预订。问题是,在查询中使用该函数时,它返回room2在2016-11-10和2016-11-15之间被预订了0次,因为表是空的。即使它不是空的,它也会返回正确的值,对它进行测试。但是当将它用作约束时,它会出现,因为行未更新,insert语句与我的约束冲突

职能:

ALTER FUNCTION [dbo].[Booked]
(
   @room int,
   @from date,
   @to date
)
RETURNS int
AS
BEGIN

return(
   SELECT count(*)
   FROM BOOKINGS
   WHERE room = @room AND NOT (@from >= to OR @to < from)
)

END

提前谢谢

以下脚本确实有效。当触发CHECK约束时,该行似乎已经在表中,并且正在函数中计数。为了避免这种情况,我在bookings表中添加了一个标识

CREATE TABLE dbo.bookings(
    id int identity(1,1),
    room int ,
    [from] date,
    [to] date
);
GO

CREATE FUNCTION dbo.IsBooked(@id int,@room int, @from date, @to date)
RETURNS BIT
AS 
BEGIN
    RETURN CASE WHEN EXISTS(SELECT * FROM bookings WHERE id<>@id AND room=@room AND NOT(@from>=[to] OR @to<[from])) THEN 1 ELSE 0 END
END
GO

ALTER TABLE dbo.bookings ADD CONSTRAINT chk_isbooked CHECK (dbo.IsBooked(id,room,[from],[to])=0);
GO

INSERT INTO dbo.bookings(room,[from],[to])VALUES(1,'20160101','20160107'); -- success
INSERT INTO dbo.bookings(room,[from],[to])VALUES(1,'20160101','20160107'); -- fail

您能指定完整的约束定义吗?可以!对不起,我完全忘了加那个。ALTER TABLE BOOKINGS ADD CONSTRAINT chk_isBooked CHECK[dbo].[Booked][room],[from],[to]=0我真的不这么认为,海报想知道如何创建函数和检查,我的问题是,即使我创建了返回正确值的工作函数,约束似乎偏离了轨道。很抱歉,如果我没有说得具体一点没关系,我认为重复链接包含了一个工作示例。“我将取消接近票数的投票。”戈登林诺夫谢谢你的提示,我正在调查,如果我发现了什么,我会向你汇报。现在我觉得自己像个智障。非常感谢你的解释,我的问题已经解决了。也感谢@GordonLidoff,让我走上了一条道路,我在用关键字“udf”和“constraint”搜索Stackoverflow时学到了很多东西。再次感谢你们!
CREATE TABLE dbo.bookings(
    id int identity(1,1),
    room int ,
    [from] date,
    [to] date
);
GO

CREATE FUNCTION dbo.IsBooked(@id int,@room int, @from date, @to date)
RETURNS BIT
AS 
BEGIN
    RETURN CASE WHEN EXISTS(SELECT * FROM bookings WHERE id<>@id AND room=@room AND NOT(@from>=[to] OR @to<[from])) THEN 1 ELSE 0 END
END
GO

ALTER TABLE dbo.bookings ADD CONSTRAINT chk_isbooked CHECK (dbo.IsBooked(id,room,[from],[to])=0);
GO

INSERT INTO dbo.bookings(room,[from],[to])VALUES(1,'20160101','20160107'); -- success
INSERT INTO dbo.bookings(room,[from],[to])VALUES(1,'20160101','20160107'); -- fail