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
如果后面是数据就好办了,但字母就有点难处理了
注意考虑并发情况
答
建一个辅助表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,...)
答
等了怎么多天,就你回答了 ,但有点麻烦。
我用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