项目中知识总结一流水号的自动生成
流水号的自动生成:
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