fquiong
fquiong
采纳率50%
2021-02-26 10:04

写个存储过程,生成4位编码[A-Z][0-9]自动增长

5
已采纳

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • weixin_41830716 规则边缘 2月前

    这个就是36进制。取十进制的0~1679615,转为36进制。再左补0就行咯。MySQL的进制转换函数为CONV(N,from_base,to_base)

    点赞 评论 复制链接分享
  • fquiong fquiong 1月前

    分享一下最终完成的结果代码。

    --第一个存储过程,将编码进行转换判断并+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

    点赞 评论 复制链接分享