实现一个产品编号
如:A5B654A0 XXX ABC
A5B654A0部分由编号规则产生(含字母和数字),XXX是流水号,ABC是后缀(字母)
需要通过触发器编流水号,XXX为0~999数字;位数不固定,ABC后缀长度不固定,也有可能没有后缀;
第一个为:A5B654A01ABC 第十个为:A5B654A010ABC 或:A5B654A010 或A5B654A010A
现在要生成第十一个编号。。
如:A5B654A0 XXX ABC
A5B654A0部分由编号规则产生(含字母和数字),XXX是流水号,ABC是后缀(字母)
需要通过触发器编流水号,XXX为0~999数字;位数不固定,ABC后缀长度不固定,也有可能没有后缀;
第一个为:A5B654A01ABC 第十个为:A5B654A010ABC 或:A5B654A010 或A5B654A010A
现在要生成第十一个编号。。
--创建一个生成编号的函数
create FUNCTION f_NextBH()
RETURNS char(14)
AS
BEGIN
RETURN(SELECT 'A5B654A0'+right('00'+ltrim(isnull(max(substring(code,9,3))+1,1)),3)+'ABC' FROM tb WITH(XLOCK,PAGLOCK))
END
GOcreate table tb(code varchar(14) default(dbo.f_NextBH()),name varchar(10))
goinsert into tb(name) select 'aa'
insert into tb(name) select 'bb'
insert into tb(name) select 'cc'select * from tb
--建表
Create table Testt (ID int IDENTITY(1,1),product_id varchar(10) ,product_name varchar(20))--建触发器
Create Trigger T_Testt on Testt
for insert
as
update Testt
set product_id='wpbh'+convert(varchar,ID)
where ID=(select ID from inserted)--插入数据
insert into Testt select NULL,'A'
insert into Testt select NULL,'B'
insert into Testt select NULL,'C'
--查看结果 select * from Testt
--结果:
ID product_id product_name
----------- ---------- --------------------
1 wpbh1 A
2 wpbh2 B
3 wpbh3 C
方式二:--如果楼住实现当前product_id 的ID 是当前ID+1 就这样写触发器Create Trigger T_Testt on Testt
for insert
as
update Testt
set product_id='wpbh'+convert(varchar,ID+1)
where ID=(select ID from inserted)
--测试语句
insert into Testt select NULL,'A'
insert into Testt select NULL,'B'
insert into Testt select NULL,'C'--查看结果 select * from Testt
ID product_id product_name
----------- ---------- --------------------
1 wpbh2 A
2 wpbh3 B
3 wpbh4 C--删除测试环境
Drop table Testt
用自增长的ID不行,第一部分 A5B654A0是不固定的,每一个新的都得从1开始;
如数据表中已有
A5B654A01
A5B654A02A
A5B654A03
A5B654A04BC
B6B123AA1
B6B123AA2
。
。
关键是要判断已有的序列号有几位,再加1。