4位编码都在[0-9][A-Z]的范围里生成,每一位都有36种变化可能。纯数字的简单,字母组合的按照以下写法,只能生成A001-ZZZZ范围内的编码,希望可以同时也生成如以下格式组合的编码0A01,0A02,....,0A99,....,0A01,0A02,....,0A99,....,
001A,002A,....,999A,....001Z,002Z,....,999Z,需要怎么修改才可以呢?
USE tempdb
GO
CREATE TABLE #Tmp1
(
ID INT IDENTITY(1,1),
samplecode VARCHAR(10)
)
begin
DECLARE @CurrentCode VARCHAR(10)
SELECT @CurrentCode=MAX(samplecode)
FROM #Tmp1
if(@CurrentCode is null) set @CurrentCode='A000'
SELECT @CurrentCode= CASE WHEN RIGHT(@CurrentCode,3)='999' THEN CHAR(ASCII(LEFT(@CurrentCode,1))+1)+'0001'
ELSE LEFT(@CurrentCode,1) + RIGHT(REPLICATE('0',3) + RTRIM(CAST(STUFF(@CurrentCode,1,1,'') AS INT)+1),3) END
INSERT INTO #Tmp1
( samplecode )
VALUES ( @CurrentCode)
end
这个就是36进制。取十进制的0~1679615,转为36进制。再左补0就行咯。MySQL的进制转换函数为CONV(N,from_base,to_base)
分享一下最终完成的结果代码。
--第一个存储过程,将编码进行转换判断并+1
CREATE FUNCTION baseSystem36
(
@one char(1)
)
RETURNS char(1)
AS
BEGIN
IF(ASCII(@one)!=57 AND ASCII(@one)!=90)---小于9 小于z 直接ASCII加一位就好
BEGIN
SET @one=CHAR(ASCII(@one)+1)
END
ELSE IF(ASCII(@one)=57)--如果已经到9了,就变成A
BEGIN
SET @one='A'
END
ELSE IF(ASCII(@one)=90)--如果已经到Z了,就进位
BEGIN
SET @one='0'
END
RETURN @one
END
--新建一个临时表保存生成的编码
CREATE TABLE #Tmp1
(
ID INT IDENTITY(1,1),
samplecode VARCHAR(10)
)
--
--第二个存储过程,进行编码拼接。这样拼接出来的4位编码,每位都有36(10个数字26个字母)种变化。可根据需要调用存储过程生成编码
DECLARE @i integer
set @i=0
DECLARE @one CHAR(1),@two CHAR(1),@three CHAR(1),@four CHAR(1),@maxsamplecode char(4);
select top 1 @maxsamplecode = samplecode from Tmp1 order by ID desc
if(@maxsamplecode is null) set @maxsamplecode='0000'
SET @one=SUBSTRING(@maxsamplecode,4,1)
SET @two=SUBSTRING(@maxsamplecode,3,1)
SET @three=SUBSTRING(@maxsamplecode,2,1)
SET @four=SUBSTRING(@maxsamplecode,1,1)
--while(@i<50000)
-- begin
IF (@one='Z' AND @two='Z' AND @three='Z' AND @four='Z') return
SET @one= dbo.baseSystem36(@one)
IF(@one='0')
BEGIN
SET @two= dbo.baseSystem36(@two)
IF(@two='0')
BEGIN
SET @three= dbo.baseSystem36(@three)
IF(@three='0')
BEGIN
SET @four= dbo.baseSystem36(@four)
END
END
END
INSERT INTO #Tmp1
( samplecode )
VALUES ( @four+@three+@two+@one)
--set @i+=1
-- end
select * from Tmp1 order by ID desc