1. 程式人生 > >觸發器:實際工作中建立指令碼時用到的

觸發器:實際工作中建立指令碼時用到的

現在有這樣的一個需求:
1. 我需要通過指令碼自動建立預約訂單,資料存在表CaseRecord中
2. 訂單號為一個固定格式自增長的:S16000001~S16009999
3. 這個訂單號的後四位是從一個表EntitySerialNo中的CurrentSerialNo欄位取值

如果通過頁面一步步操作,會自動生成訂單號,這樣做效率太低。我要做的是通過指令碼自動建立訂單,然後供後續使用。

我的思路是:
1. 我先查詢CaseRecord中訂單號的最大值
2. 將這個訂單號的後四位分離出來
3. 將分離出來的四位數增加到EntitySerialNo中的CurrentSerialNo的值

現在的問題是:當執行指令碼後,沒法兒讓EntitySerialNo中的CurrentSerialNo的指自動增加,而且還要保證不論是通過指令碼建立訂單還是通過頁面正常建立,這個訂單號在兩個表中的值是統一的正確的。

那就可以建立一個after觸發器,每當insert一條資料後,就自動觸發對EntitySerialNo中的CurrentSerialNo的值的更新操作

Here we go!!

自動建立訂單的指令碼如下:

/*手動建立預約單(待優化)
*/

declare @casecode varchar(50)
declare @casecode1 varchar(50)
declare @casecode
2 varchar(50) declare @StoreId varchar(12) --set @casecode = (select top 1 CaseCode from CaseRecord order by CaseCode desc) --set @casecode1 = convert(nvarchar,convert (int,right(@casecode,4)+1)) set @casecode2 = (select 'S1600' + convert(nvarchar,convert (int,right(MAX(casecode),4)+1)) from CaseRecord) set @StoreId
= 'NJOP019' insert CaseRecord --values ('S1600'+@casecode2,@StoreId, values (@casecode2,@StoreId, 1,null, 'couey21','13818386575', null,convert(varchar(20),getdate(),120), null,null,'',null,null,null,null, '00553',null,null,'Very good', 0,null,2,'',5,null,'門店散客',null,null,null,GETDATE(),'00553',GETDATE(),'00553')

接下來,就對EntitySerialNo表建立觸發器:


--觸發器
ALTER trigger [dbo].[addEntityNo1] on [dbo].[CaseRecord]
--instead of insert
for insert
--after insert
as

declare @casecode varchar(50)
declare @casecode1 varchar(50)
set @casecode = (select top 1 CaseCode from CaseRecord order by CaseCode desc)
set @casecode1 = convert(nvarchar,convert (int,right(@casecode,4))) 

update a set CurrentSerialNo= @casecode1 
from EntitySerialNo a
inner join inserted i on a.EntityName = a.EntityName 
where a.EntityName = 'S'

經過多次修改,成功!!

這裡需要注意的是:
1. 注意insert後,EntitySerialNo表的CurrentSerialNo如何自增取值
·

set @casecode = (select top 1 CaseCode from CaseRecord order by CaseCode desc)
set @casecode1 = convert(nvarchar,convert (int,right(@casecode,4))) 

set CurrentSerialNo= @casecode1 
  1. 注意訂單號的後四位擷取方法:
set @casecode2 = (select 'S1600' + convert(nvarchar,convert (int,right(MAX(casecode),4)+1)) from CaseRecord)