项目中知识总结一流水号的自动生成

流水号的自动生成:

1.原理:每生成一次流水号,把流水号记录到一张表中,每次生成流水号时,从数据库取出前一次生成的流水号,再对取出来的流水号进行操作,生成下一个流水号。

2.首先建立一张表,表的结构:App_SequenceNumber(表名)

列名 类型 说明
InfoId int 自动增长
Code   nvarchar(10) 编码
Prefix nvarchar(5) 流水号的前面抬头
DateType nvarchar(8) 日期的类型
Infix nvarchar(5)  
IndexLength int 增加的大小
Suffix nvarchar(5)  
MaxDate nvarchar(8) 目前日期
MaxIndex int 流水号的最后的值
CurrentMaxValue nvarchar(4000) 当前的流水号

3.存储过程:

Create PROCEDURE [dbo].[Asset_system_spGetSequenceNumber]
(
 @pi_Code varchar(10),
 @pi_Count int ,
 @po_Status int output,
 @po_RetValue varchar(200) output
)
AS
BEGIN
   
 DECLARE @NewValue nvarchar(20), @CurrentDate nvarchar(8);
 DECLARE @Prefix nvarchar(5), @DateType nvarchar(8), @Infix nvarchar(5), @Suffix nvarchar(5);
 DECLARE @MaxIndex int, @IndexLength tinyint, @MaxDate nvarchar(8);

 BEGIN TRAN
  --读取配置信息
  SELECT  @Prefix = Prefix, @Infix = Infix, @Suffix = Suffix,
    @DateType = DateType, @MaxDate=MaxDate,
    @MaxIndex = MaxIndex, @IndexLength = IndexLength
   FROM App_SequenceNumber with(xlock) WHERE Code=@pi_Code;
  
  --取得日期部分
  SET @CurrentDate= SUBSTRING(Convert(nvarchar(8), GetDate(), 112),
   CASE SubString(@DateType, 1, 4)
    WHEN 'yyyy' THEN 1
    WHEN 'yyy' THEN 2
    ELSE 3
   END, LEN(@DateType));
  
  IF(@CurrentDate = @MaxDate)   
   SET @MaxIndex = @MaxIndex + @pi_Count; --累加
  ELSE
   SET @MaxIndex = @pi_Count; --归1
  
  
  --超过自增长度限制,自动扩展自增部分的长度
  IF(@MaxIndex >= POWER(10, @IndexLength))
   SET @IndexLength = @IndexLength + 1;
  
  --测试并发
  --Waitfor delay '00:00:10';
   
  Update App_SequenceNumber SET MaxDate = @CurrentDate, MaxIndex=@MaxIndex, IndexLength=@IndexLength WHERE Code=@pi_Code;
 COMMIT TRAN
 
 --取得获取到的最大值
 --SELECT  (@Prefix + @CurrentDate + @Infix + Replace(STR(@MaxIndex, @IndexLength), ' ' , '0') + @Suffix), @IndexLength, Len(@Suffix);
 SET @po_RetValue =  (@Prefix + @CurrentDate + @Infix + Replace(STR(@MaxIndex, @IndexLength), ' ' , '0') + @Suffix)
set @po_Status = 100
 
END

posted @ 2012-05-15 12:32  浅谈生活  阅读(984)  评论(1编辑  收藏  举报