一、非存儲過程生成的流水號
/// <summary> /// /// </summary> public static class DataBaseGenerator { /// <summary> /// /// </summary> private static Int64 seed = Int64.Parse(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalMilliseconds.ToString("0")); /// <summary> /// /// </summary> /// <returns></returns> public static Int64 GetPrimaryKey() { return Interlocked.Increment(ref seed); } }
二、存儲過程生成流水號
1,首先在數據庫中創建一個存放流水號的表
CREATE TABLE [dbo].[NumSeq] ( [Cate] [varchar] (2) NOT NULL , [DateNo] [varchar] (4) NOT NULL , [Seq] [int] NULL , [CrTime] [datetime] NOT NULL )
上面的代碼中,Cate 字段為流水號的頭,可以在下面的存儲過程中用參數的方式傳入,我的定義是2個字符,這個可以根據具體需要更改
DateNo 字段為獲取日期信息
Seq 字段為流水號,但最終生成的流水號是這三個字段的相加
2,創建存儲過程
CREATE PROC dpPMT_SGetMaintainSeq @MaintainCate VARCHAR(2) AS --***********************累加編號************************************************* DECLARE @MaintainNo VARCHAR(12) IF NOT EXISTS(SELECT * FROM NumSeq WHERE Cate=@MaintainCate AND DATEDIFF(DAY,CrTime,GETDATE())=0) BEGIN INSERT INTO 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) END ELSE BEGIN UPDATE NumSeq SET Seq=Seq+1 WHERE Cate=@MaintainCate AND 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=@MaintainCate AND DateNo=RIGHT(CONVERT(VARCHAR(4),YEAR(GETDATE())),2)+ REPLICATE('0',2-LEN(MONTH(GETDATE())))+CONVERT(VARCHAR(2),MONTH(GETDATE())) SELECT @MaintainNo
這個存儲過程最終輸出的結果如:AA071031000001 前面兩位是傳入的參數,中間四位是年份的后兩位和月,最后的六位為6位數字的流水號。您也可以修改上面的存儲過程來生成符合您要求的流水號