项目中往往有一些单据流水号或者流程流水号是希望通过新增一条记录后自动产生一个编号的,比如新增一条流程就自动根据当前日期自动添加该流程的流程流水号,下面介绍两种不同类型流水号通过SQL自动产生的方法。
流水号格式:
第一种(数值类型):日期+流水号,比如“201104190001”-->"201104190002";
第二种(文本类型):前缀+日期+流水号,比如“WT201104190001”-->"WT201104190002"。
不论哪种情况,流水号的生成原则都是一样的,流水号的产生都需要根据当前日期产生,新增的一条记录的流水号为当前日期下所有记录中流水号最大那条加1得来。
一、数据库中添加一个表:TestNo
列名 数据类型 说明
ID uniqueidentifier 主键
No bigint 流水号字段,不过是纯数字型的流水号,这个为本例子的第一种情况,流水号可以为纯数字
DT datetime 新增一条记录的当前时间,相信每新增一条记录都会记录这次操作的当前时间的。
CharNo varchar(50) 流水号字段,不过是可以有字符的流水号,这个为本例子的第二种情况。
二、SQL代码
------ --自动流水号为纯数字的情况,如 201104190005 ------ declare @x int, @y char(8) select @x= COUNT(no) from TestNo where CAST(DT as date)=CAST(GETDATE() as date) if(@x=0) begin select @y=convert(char(8),getdate(),112) insert TestNo(No,DT) values( @y+'0001' ,GETDATE()) end else insert TestNo(No,DT) values( (select MAX(No)+1 from TestNo where CAST(DT as date)=CAST(GETDATE() as date)) ,GETDATE()) select * from TestNo ------ --自动流水号为字符的情况,如 WT201104190005 ------ declare @x1 int, @y1 char(8) select @x1= COUNT(CharNo) from TestNo where CAST(DT as date)=CAST(GETDATE() as date) if(@x1=0) begin select @y1=convert(char(8),getdate(),112) insert TestNo(CharNo,DT) values( 'WT'+@y1+'0001' ,GETDATE()) end else begin insert TestNo(CharNo,DT) values( 'WT'+cast((select MAX(CAST( SUBSTRING(charno,3,12) as bigint))+1 from TestNo where CAST(DT as date)=CAST(GETDATE() as date))as varchar(50)) ,GETDATE()) end select * from TestNo
三、自己改写的例子(假如表中没有现成的创建时间)
ALTER FUNCTION [dbo].[udf_GenerateCutSampleNo]() RETURNS varchar(20) AS BEGIN DECLARE @rtn VARCHAR(20) --每日流水号归零 DECLARE @countOfToday int,@ymd char(8) --如果“ID”里没有今天的数据 select @countOfToday= COUNT(1) FROM dbo.CutSampleDtl WHERE CAST(RIGHT(LEFT(Sample_No,9),8) AS DATE)=CAST(GETDATE() as date) if(@countOfToday=0) begin select @ymd=convert(char(8),getdate(),112) SET @rtn= 'D'+@ymd+'0001' end else begin SET @rtn= 'D'+cast((select MAX(CAST( SUBSTRING(Sample_No,2,12) as BIGINT))+1 from dbo.CutSampleDtl)as varchar(50)) end RETURN @rtn END
参考:https://www.cnblogs.com/About690878778/archive/2011/04/19/2020782.html