2 feng88ling feng88ling 于 2015.07.01 19:09 提问

sql 按规则生成编号,字母递增

生成规则 HFR+Code+Date
这是生成的主键编号
HFR-xxx-20150101
HFR-xxx-20150104
HFR-xxx-20150109
HFR-xxx-20150111
HFR-xxx-20150112

当Code和Date重复时就在后面加字母区分
HFR-xxx-20150101
HFR-xxx-20150101A
HFR-xxx-20150101B
HFR-xxx-20150101C
HFR-xxx-20150101D
超过26个字母就这样
HFR-xxx-20150101Z
HFR-xxx-20150101ZA
.....
HFR-xxx-20150101ZZA
....
HFR-xxx-20150101ZZZA
如果后面是数据就好办了,但字母就有点难处理了
注意考虑并发情况

2个回答

Tiger_Zhao
Tiger_Zhao   Rxr 2015.07.02 10:54
已采纳

建一个辅助表SubCode(No,Code),内容

    No Code
    -- ----
     0      <-Code为空字符串
     1 A
     2 B
    ...
    26 Z
    27 ZA
    ...

以下为SQL Server的例子

    DECLARE @key varchar(20)
    DECLARE @lastKey varchar(20)
    DECLARE @subCode varchar(4)
    DECLARE @no int

    -- 编号前缀
    SET @key = 'HFR-xxx-20150101'
    -- 求最大编号
    SELECT @lastKey = MAX([key]) FROM table1

    IF (@lastKey IS NOT NULL)
    BEGIN
        -- 最大子编号
        SET @subCode = SUBSTRING(@lastKey,LEN(@key)+1,4)
        SELECT @no = No FROM SubCode WHERE Code = @subCode
        -- 下个子编号
        SELECT @subCode = Code FROM SubCode WHERE No = @no + 1
        -- 拼接
        SET @key = @key + @subCode
    END
    /*
    ELSE 直接使用编号 @key
    */

    -- 并发只能用编号唯一引发错误,重试
    INSERT INTO table1([key],...)
    VALUES(@key,...)
feng88ling
feng88ling   2015.07.10 15:57

等了怎么多天,就你回答了 ,但有点麻烦。
我用ASCII将字母转成数字,65-A,66-B......
模糊查找like HFR-xxx-20150101时返回count=1,
新生成的编号就是HFR-xxx-20150101+char(65+count-1)
即HFR-xxx-20150101A
再次模糊查找like HFR-xxx-20150101时返回count=2,
新生成的编号就是HFR-xxx-20150101+char(65+count-1)
即HFR-xxx-20150101B
到了Z在处理一下,在后面加A

Csdn user default icon
上传中...
上传图片
插入图片