觸發器:實際工作中建立指令碼時用到的
阿新 • • 發佈:2019-01-28
現在有這樣的一個需求:
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
- 注意訂單號的後四位擷取方法:
set @casecode2 = (select 'S1600' + convert(nvarchar,convert (int,right(MAX(casecode),4)+1)) from CaseRecord)