您的位置:首页 > 其它

触发器:实际工作中创建脚本时用到的

2016-07-13 19:56 330 查看
现在有这样的一个需求:

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 @casecode2 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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: