我系统中有很多需要生成流水号的地方,比如出库单、入库单等,每天的流水号自动复位为0,为此我写了一个存储过程。
首先建一个表
--SeqName是序号的名字,SeqDate是日期,CurValue是当前的值
create table T_DailySeqNo(id bigint identity,SeqName nvarchar(50),SeqDate datetime,CurValue int)
例子数据:
2 入库单 2011-5-7 0:00:00 102
3 出库单 2011-5-9 0:00:00 30
存储过程:
create procedure usp_getSeqNo
(
@SeqName nvarchar(50),
@result int output
)
AS
BEGIN
BEGIN TRAN
--更新当天的流水号+1(可能不存在)
Update T_DailySeqNo set CurValue=CurValue+1
where SeqName=@SeqName and DATEDIFF(day,SeqDate,getdate())=0
--取得数据库中是否有当天的序列号
DECLARE @todaycount int
select @todaycount=count(*) from T_DailySeqNo
where SeqName=@SeqName and DATEDIFF(day,SeqDate,getdate())=0
if @todaycount<=0
begin
--如果数据库中没有当前序列号数,则插入初始值1
insert into T_DailySeqNo(SeqName,SeqDate,CurValue)
values(@SeqName,convert(varchar(10),getdate(),20),0)
end
--取得最大的序号数
select @result=Max(CurValue) from T_DailySeqNo
where SeqName=@SeqName and DATEDIFF(day,SeqDate,getdate())=0
COMMIT
END
调用测试
declare @result int
exec usp_getSeqNo '入库单',@result output
select @result
我对锁不太熟悉,不知道会不会有并发问题,我写了一个程序启动三个线程同时执行,都没有重复生成流水号的。但是由于没有高人的指点,还是不放心。
请高人看一下这个有没有并发问题,以及能否继续改进。
1你可以做一个job 每天0点自动把CurValue设成0