实现一个产品编号
如:A5B654A0 XXX ABC
A5B654A0部分由编号规则产生(含字母和数字),XXX是流水号,ABC是后缀(字母)
需要通过触发器编流水号,XXX为0~999数字;位数不固定,ABC后缀长度不固定,也有可能没有后缀; 
第一个为:A5B654A01ABC  第十个为:A5B654A010ABC 或:A5B654A010 或A5B654A010A
现在要生成第十一个编号。。

解决方案 »

  1.   


    --创建一个生成编号的函数
    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
      

  2.   

    利用触发器生成编号 有一表(ID,product_id,product_name),其中ID是自动编号,当向这表添加数据时候,product_id自动添加数据,格式是"wpbh"&max(id)+1,这样的触发器怎么写?(注意:product_id字段的数据是要求通过触发器添加的,由添加数据前最大的ID+1 组成。)方式一:-测试环境
    --建表
    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
      

  3.   

    谢谢!
    用自增长的ID不行,第一部分 A5B654A0是不固定的,每一个新的都得从1开始; 
    如数据表中已有
    A5B654A01
    A5B654A02A
    A5B654A03
    A5B654A04BC
    B6B123AA1
    B6B123AA2


    关键是要判断已有的序列号有几位,再加1。
      

  4.   

    http://blog.csdn.net/fcuandy/archive/2008/12/15/3522876.aspx