2013-08-02 20 views
1

我正在尝试创建一个触发器,它将连续预订号码分配给会话预订。这些号码印在门票上,有点像电影票上的座位号。如何使用SQL Server触发器在字段中创建连续数字?

  1. 当SessionBooking记录被创建时,我希望触发器分配BookingNumber。
  2. 如果SessionBooking逻辑删除(IsDeleted = 1),则BookingNumber应设置为NULL
  3. 当SessionBooking被逻辑删除时,应在下次创建SessionBooking时重新分配BookingNumber。
  4. 会话还保持SessionBookings未逻辑删除
  5. 的BookingCount一旦BookingNumber已被分配,它不应该被改变(除非它被删除)

数据库的相关部分模式是:

----- ----------------- 
Table Session 
----- ----------------- 
PK SessionID 
int BookingCount  (count of SessionBookings) 

----- ----------------- 
Table SessionBooking 
----- ----------------- 
PK SessionBookingID 
FK SessionID 
int BookingNumber  (allows nulls) 
bool IsDeleted   (1 = deleted) 

这是我到目前为止。对我来说这似乎太复杂了,出于某种原因,有时候我创建SessionBooking时,BookingNumber仍然为NULL。

对于一些疯狂的原因,我不能发表这个文本,我不得不使用屏幕捕获...

enter image description here

+0

由于某种原因,我不能在问题中发布触发器的SQL - 我只是得到错误。 –

+0

你真的必须为'DELETE'开火吗?设置一个表经历逻辑删除('IsDeleted =')和物理删除是很奇怪的。 –

+0

你说得对,物理删除不会真的发生,除非你修改一条记录,并且它出现在INSERTED和DELETED表中 –

回答

1

这将寻找下一个未使用的预订号码。

;with live as (select * from sessionBooking where isdeleted=0) 
select isnull(min(t1.bookingNumber)+1,1) 
from live t1 
    left join live t2 on t1.bookingNumber+1=t2.bookingNumber 
where t2.bookingnumber is null 
+0

我尝试过类似的东西(但是有一个内部联接),但是在创建第一条记录时失败因为没有现有的记录。 –

+0

这并没有做到,但是+1,因为我不知道WITH语句,我认为这会让我朝着正确的方向发展。 –

+0

@DerekTomes我已将其调整为适用于无记录情况。 – podiluska

相关问题