如何在函数中使用SELECT比较字段

时间:2019-05-02 10:37:42

标签: sql function

共有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”。

我该如何处理?我的方法是完全错误的,为此我不需要在函数中有表格吗?

1 个答案:

答案 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