现在有这样的一个需求:
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)