Как использовать SELECT в функции для сравнения полей - PullRequest
1 голос
/ 02 мая 2019

Есть 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 ».

Как мне с этим бороться? Является ли мой подход совершенно неправильным, и мне не нужна таблица в функции для этого?

1 Ответ

0 голосов
/ 02 мая 2019

Я не понимаю, почему вы используете для этого переменную таблицы. Вы не можете просто ссылаться на таблицу, если не укажете предложение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...