一个产生流水号(年月日+5位流水号)的存储过程
现在客户有一个需求,要产生一个流水号,如090611+000001(年月日+五位流水号),此流水号在数据库表中是主键,且为varchar类 型。如果在当天之内插入此流水号,则此流水号递增,即:090611000001,090611000002,090611000003,如果不是在当天 时间,必须从090612000001开始递增。我写了个存储过程实现它。
create procedure test_proc
@id nvarchar(13) output
as
begin
set nocount on
declare @date nvarchar(8),
@maxdj_no numeric(13,0)
select @date = convert(nvarchar(20),getdate(),112) , @maxdj_no = convert(numeric(13,0),max(id)) from XT_DJNO
if substring(convert(char(20),@maxdj_no),1,6) = substring(@date,3,8) --如果当日已经产生单据编号
begin
select @id = convert(nvarchar(13),@maxdj_no+1)
--print(@maxdj_no+1)
insert into XT_DJNO values(substring(@id,3,13),substring(convert(char(20),@maxdj_no),1,6))
--print(substring(convert(char(20),@maxdj_no),1,6))
return
end
else
begin
set @date=substring(@date,3,8)
set @id = @date + '00001'
insert into XT_DJNO values(@id,convert(nvarchar(13),@maxdj_no))
--print(substring(@date,3,8))
return
end
end
ORACLE中生成流水号 创建一个序列:
create sequence EXAMPLE_SEQ
increment by 1
start with 1
minvalue 1
cache 20;
在EXAMPLE表上创建一个触发器
CREATE OR REPLACE TRIGGER "PORTAL".TRI_EXAMPLE_TABLE BEFORE INSERT ON EXAMPLE_TABLE FOR EACH ROW
begin
select to_char(sysdate,'YYYYMMDD')||to_char(EXAMPLE_SEQ.nextval,'0000') into :new.EXAMPLE_ID from dual;
end;
首先在数据库中创建一个存放流水号的表
CREATETABLE[dbo].[NumSeq] ( [Cate][varchar] (2) NOTNULL , [DateNo][varchar] (4) NOTNULL , [Seq][int]NULL , [CrTime][datetime]NOTNULL )
上面的代码中,Cate 字段为流水号的头,可以在下面的存储过程中用参数的方式传入,我的定义是2个字符,这个可以根据具体需要更改
DateNo 字段为获取日期信息
Seq 字段为流水号,但最终生成的流水号是这三个字段的相加
创建存储过程
CREATEPROC dpPMT_SGetMaintainSeq @MaintainCateVARCHAR(2) AS--***********************累加编号*************************************************DECLARE@MaintainNoVARCHAR(12) IFNOTEXISTS(SELECT*FROM NumSeq WHERE Cate=@MaintainCateANDDATEDIFF(DAY,CrTime,GETDATE())=0) BEGININSERTINTO NumSeq(Cate,DateNo,Seq) values(@MaintainCate,RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE())),0) ENDELSEBEGINUPDATE NumSeq SET Seq=Seq+1WHERE Cate=@MaintainCateAND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE())) END--************************组合编号***************************************************************SELECT@MaintainNo=Cate+DateNo+REPLICATE('0',6-LEN(Seq))+CONVERT(VARCHAR(6),Seq) FROM NumSeq WHERE Cate=@MaintainCateAND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE())) SELECT@MaintainNo
这个存储过程最终输出的结果如:AA071031000001 前面两位是传入的参数,中间四位是年份的后两位和月,最后的六位为6位数字的流水号。您也可以修改上面的存储过程来生成符合您要求的流水号