共有3个表:“事件”,“预订”和“ Booking_Day”。
想法是可以预定活动的不同日期。
我想对Booking_Day施加约束,以便Day必须在相应事件的Date_Start和Date_End范围内。我决定使用可以执行此操作的功能
create table Event
(
Event_ID int identity
constraint Event_pk
primary key nonclustered,
Date_Start date not null,
Date_End date
)
create table Booking
(
Booking_ID int identity
constraint Booking_pk
primary key nonclustered,
Event_ID int not null
constraint Booking_Event_Event_ID_fk
references Event
)
create table Booking_Day
(
Day date not null,
Booking_ID int not null
constraint Booking_Day_Booking_Booking_ID_fk
references Booking,
constraint Booking_Day_pk
primary key nonclustered (Day, Booking_ID)
)
函数:
CREATE FUNCTION check_if_in_range (
@Event_id int,
@Day DATE
) RETURNS int
BEGIN
declare @result TABLE (Day DATE,Booking_ID INT,Event_ID INT,Date_start DATE, Data_end DATE)
INSERT into @result
SELECT Booking_Day.Day, Booking.Event_ID, Event.Date_Start, Event.Date_End
FROM ((Booking_Day INNER JOIN Booking on Booking_Day.Booking_ID = B.Booking_ID )
INNER JOIN Event on Event.Event_ID = Booking.Event_ID) WHERE Booking_Day.Day = @Day AND B.Event_ID = @Event_id
return ((@Day >= @result.Date_start) AND (@Day <= @result.Data_end))
END
由于Booking_day表上的主键约束,上面的内容应该只返回一行。
当尝试添加函数时,数据库显示“ [[S0001] [137]必须声明标量变量” @result”。
我该如何处理?我的方法是完全错误的,为此我不需要在函数中有表格吗?
答案 0 :(得分:0)
我不明白为什么您要为此使用表变量。除非您指定FROM
子句,否则您不能仅引用表,否则会混淆表变量和标量变量。
但是为什么要麻烦变量呢?
IF (EXISTS (SELECT 1
FROM Booking_Day bd INNER JOIN
Booking b
ON bd.Booking_ID = B.Booking_ID INNER JOIN
Event e
ON e.Event_ID = b.Event_ID
WHERE b.Day = @Day AND
b.Event_ID = @Event_id AND
@Day >= e.Date_Start AND
@Day <= e.Data_end
)
)
BEGIN
return 1
END;
return 0