博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SQL 生成可配置流水号
阅读量:6816 次
发布时间:2019-06-26

本文共 3445 字,大约阅读时间需要 11 分钟。

需求背景

每执行一次方法,根据公式返回最新的流水号。
第一次使用时需要先插入一条数据,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) asbeginif(len(@num)=0)begin    return ''enddeclare @curStr varchar(16)select @curStr = isnull(replicate(@paddingChar,@totalWidth - len(isnull(@num ,0))), '') + @numreturn @curStrend
Create PROCEDURE [dbo].[Biz_GetSeqNo]    @BizSeqType varchar(50)ASBEGIN    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=@BizSeqTypeselect @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())endelse if(charindex('[yy]',@Formula)>0)begin    select @Yearindex=charindex('[yy]',@Formula)    select @year=SUBSTRING(CAST(YEAR(getdate()) as varCHAR(4)),3,2)endselect @monthindex=charindex('[mm]',@Formula)if(@monthindex>0)begin    select @month=month(getdate())endselect @dayindex=charindex('[dd]',@Formula)if(@dayindex>0)begin    select @day=day(getdate())endselect @Half1=@Prefix+@Year+dbo.PadLeft(@Month,'0',2)+dbo.PadLeft(@Day,'0',2)--select @Half1,@Prefix,@Yearif(@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-6endelse 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-4endelse 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-2endelsebegin    select @Half2=SUBSTRING(@Formula,LEN(@Prefix)+1,999)    select @Count=COUNT(1) from SM_BizSeqNo where BizSeqType=@BizSeqTypeendif(@Count>0) --当前流水号+1begin    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=@BizSeqTypeendelsebegin    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=@BizSeqTypeendselect BizSeqValue from SM_BizSeqNo where BizSeqType=@BizSeqTypeEND

 

 

转载于:https://www.cnblogs.com/geass/p/3598265.html

你可能感兴趣的文章
奇怪的“考生”:中美高考,我都考一考!
查看>>
winform datagridview 使用论坛。
查看>>
Cocos Studio study ---------- 使用CocosStudio1.6制作 界面,并结合代码制作游戏
查看>>
关于LittleSis网站数据API的简单整理
查看>>
虚函数的实现
查看>>
【原】Oracle 数据库实例启动过程
查看>>
上传文件和导出的测试用例设计
查看>>
程序员为何如此累
查看>>
ajax(异步页面动态刷新)
查看>>
关于JQuery的选择器
查看>>
Java和C++的区别
查看>>
git工作区和暂存区
查看>>
C函数调用与栈
查看>>
SQL优化小技巧
查看>>
UVALive 4850 Installations 贪心
查看>>
JS 中刷新页面的方法
查看>>
励志帝马云是不是你的财富导师?
查看>>
力扣算法题—088合并两个有序数组
查看>>
APP和web设计区别
查看>>
三层fragment嵌套,接口回调方式
查看>>