zoukankan      html  css  js  c++  java
  • SQL 生成可配置流水号

    需求背景

    每执行一次方法,根据公式返回最新的流水号。
    第一次使用时需要先插入一条数据,BizSeqValue 为流水起始号:A2014030000,Formula 为公式:A[yyyy][mm][c4],UseTime 为当前时间。

    创建流水号表
    CREATE
    TABLE [dbo].[SM_BizSeqNo]( [BizSeqID] [int] IDENTITY(1,1) NOT NULL,
    [BizSeqValue][nvarchar](50) NULL,
    [BizSeqName] [nvarchar](50) NULL,[UseTime] [datetime] NULL, [Formula] [varchar](50) NULL)
    创建PadLeft 函数
    Create function [dbo].[PadLeft](@num varchar(16),@paddingChar char(1),@totalWidth int) returns varchar(16) as begin if(len(@num)=0) begin return '' end declare @curStr varchar(16) select @curStr = isnull(replicate(@paddingChar,@totalWidth - len(isnull(@num ,0))), '') + @num return @curStr end
    Create PROCEDURE [dbo].[Biz_GetSeqNo]
        @BizSeqType varchar(50)
    AS
    BEGIN
        declare
    @BizSeqValue varchar(50),
    @Prefix varchar(10),
    @Year varchar(4),
    @Yearindex int,
    @Month varchar(2),
    @Monthindex int,
    @Day varchar(2),
    @Dayindex int,
    @DigitsIndex int,
    @DigitsEndIndex int,
    @Digits int,
    @FlowNum varchar(50),
    @Half1 varchar(50),
    @Half2 varchar(50),
    @Count int,
    @Formula varchar(50)
    
    set @Year='' set @Month='' set @Day=''
    select @Formula=Formula,@BizSeqValue=BizSeqValue from SM_BizSeqNo where BizSeqType=@BizSeqType
    select @Prefix=SUBSTRING(@Formula,0,charindex('[',@Formula))
    select @DigitsIndex=charindex('[c',@Formula)
    select @DigitsEndIndex=charindex(']',@Formula,@DigitsIndex+2)
    select @Digits=SUBSTRING(@Formula,@DigitsIndex+2,@DigitsEndIndex-@DigitsIndex-2)
    select @Yearindex=charindex('[yyyy]',@Formula)
    if(@Yearindex>0)
    begin
        select @year=YEAR(getdate())
    end
    else if(charindex('[yy]',@Formula)>0)
    begin
        select @Yearindex=charindex('[yy]',@Formula)
        select @year=SUBSTRING(CAST(YEAR(getdate()) as varCHAR(4)),3,2)
    end
    select @monthindex=charindex('[mm]',@Formula)
    if(@monthindex>0)
    begin
        select @month=month(getdate())
    end
    select @dayindex=charindex('[dd]',@Formula)
    if(@dayindex>0)
    begin
        select @day=day(getdate())
    end
    select @Half1=@Prefix+@Year+dbo.PadLeft(@Month,'0',2)+dbo.PadLeft(@Day,'0',2)
    --select @Half1,@Prefix,@Year
    if(@Dayindex>0)
    begin
        select @Half2=SUBSTRING(@Formula,@Dayindex+4,999)
        select @Count=COUNT(1) from SM_BizSeqNo where BizSeqType=@BizSeqType and DATEDIFF(DAY,UseTime,GETDATE())=0 
        select @DigitsIndex=@DigitsIndex-6
    end
    else if(@Monthindex>0)
    begin
        select @Half2=SUBSTRING(@Formula,@Monthindex+4,999)
        select @Count=COUNT(1) from SM_BizSeqNo where BizSeqType=@BizSeqType and DATEDIFF(MONTH,UseTime,GETDATE())=0 
        select @DigitsIndex=@DigitsIndex-4
    end
    else if(@Yearindex>0)
    begin
        select @Half2=SUBSTRING(@Formula,@Yearindex+2+LEN(@year),999)
        select @Count=COUNT(1) from SM_BizSeqNo where BizSeqType=@BizSeqType and DATEDIFF(YEAR,UseTime,GETDATE())=0 
        select @DigitsIndex=@DigitsIndex-2
    end
    else
    begin
        select @Half2=SUBSTRING(@Formula,LEN(@Prefix)+1,999)
        select @Count=COUNT(1) from SM_BizSeqNo where BizSeqType=@BizSeqType
    end
    if(@Count>0) --当前流水号+1
    begin
        select @FlowNum=cast(SUBSTRING(@BizSeqValue,@DigitsIndex,@Digits) as bigint)+1
        select @FlowNum=dbo.PadLeft(@FlowNum,'0',@Digits)
        update SM_BizSeqNo set BizSeqValue=@Half1+REPLACE(@Half2,'[c'+cast(@Digits as varchar(50))+']',@FlowNum),
        UseTime = GETDATE() where BizSeqType=@BizSeqType
    end
    else
    begin
        select @FlowNum=dbo.PadLeft('1','0',@Digits)
        update SM_BizSeqNo set BizSeqValue=@Half1+REPLACE(@Half2,'[c'+cast(@Digits as varchar(50))+']',@FlowNum),
        UseTime = GETDATE() where BizSeqType=@BizSeqType
    end
    select BizSeqValue from SM_BizSeqNo where BizSeqType=@BizSeqType
    END
  • 相关阅读:
    JAVA 问题
    WebStrom配置多个项目的Dweployment时,设置默认的启动配置
    C#中有关数组和string引用类型或值类型的判断
    Delegate(代理)异常:该委托必须有一个目标
    RMAN BACKUP
    Oracle ORA-01033: 错误解决办法
    微信公众号开发 接口配置信息 配置失败
    使用JAVA开发微信公众平台(一)——环境搭建与开发接入
    微信开发准备(四)--nat123内网地址公网映射实现
    nat123安装启动教程帮助
  • 原文地址:https://www.cnblogs.com/geass/p/3598265.html
Copyright © 2011-2022 走看看