Есть 3 таблицы: Event, Booking и 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 вышеприведенное должно возвращать только одну строку.
При попытке добавить функцию do database я получаю «[[S0001] [137] Должен объявить скалярную переменную« @result ».
Как мне с этим бороться? Является ли мой подход совершенно неправильным, и мне не нужна таблица в функции для этого?