ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

通过SQL自动添加流水号

2020-11-29 11:01:48  阅读:425  来源: 互联网

标签:TestNo CAST 流水号 添加 SQL DT select GETDATE


 项目中往往有一些单据流水号或者流程流水号是希望通过新增一条记录后自动产生一个编号的,比如新增一条流程就自动根据当前日期自动添加该流程的流程流水号,下面介绍两种不同类型流水号通过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 

 

标签:TestNo,CAST,流水号,添加,SQL,DT,select,GETDATE
来源: https://blog.csdn.net/qq285679784/article/details/110307000

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有