SQL Server利用存儲過程生成流水號
USE BiddingConfig SET QUOTED_IDENTIFIER ON SET ANSI_NULLS ON GO -- ============================================= -- Author: 小爽 -- Create date: 2017-05-25 -- Description: 業務數據KEY生成 -- 構成規則: [區域編號][應用系統編號][版本編號][功能編號][日期戳][流水記錄號] -- 數據長度: 28位 -- [區域編號]: 6位 例:320100 -- [系統編號]: 2位(交易平台[10+](業務系統、輔助開評標系統)、公共服務平台[40+]、監督平台[50+]、其他擴展[60+]) -- [版本編號]: 2位(10+) -- [功能編號]: 4位 -- [日期戳]: 8位,格式化yyMMdd -- [流水號]: 6位,應該當日記錄流水號 -- ============================================= ALTER PROCEDURE [dbo].[proc_BuildBizDataKey] ( @AppNo NCHAR(2), -- 系統編號 @FunctionNo NVARCHAR(10), -- 功能編號 @ReturnValue NCHAR(28) OUTPUT -- 業務數據KEY ) AS BEGIN -- ======================================= 變量定義 DECLARE @AreaNo NCHAR(6) = '321000' -- 區域編號 DECLARE @VersionNo NCHAR(2) = '10' -- 版本編號 DECLARE @LastSerialNo NCHAR(6) = '' -- 上次流水號 DECLARE @SerialNo NCHAR(6) = '' -- 流水號 DECLARE @TodayDate NCHAR(8) = '' -- 當前日期 -- ======================================================================= 變量賦值 SET @TodayDate = REPLACE(CONVERT(NVARCHAR(10),GETDATE(),120),'-','') -- 當前日期格式化:yyyyMMdd BEGIN TRY BEGIN TRANSACTION IF(LEN(@FunctionNo)>4) BEGIN SET @FunctionNo =SUBSTRING(@FunctionNo,3,4) END -- 驗證參數 IF(ISNULL(@AreaNo,'') = '' OR ISNULL(@AppNo,'') = '' OR ISNULL(@VersionNo,'') = '' OR ISNULL(@FunctionNo,'') = '' OR ISNULL(@FunctionNo,'') = '') BEGIN RAISERROR ('空參數!', 11, 1) END -- 取得上次業務數據KEY SELECT @LastSerialNo = ISNULL([SerialNo],'') FROM [biz_DataKey] WHERE [AreaNo] = @AreaNo AND [AppNo] = @AppNo AND [VersionNo] = @VersionNo AND [FuncionNo] = @FunctionNo AND [DateStamp] = @TodayDate -- 數據KEY不存在,生成新KEY IF (ISNULL(@LastSerialNo,'') = '') BEGIN SET @SerialNo = '000001' SET @ReturnValue = @AreaNo + @AppNo + @VersionNo + @FunctionNo + @TodayDate + @SerialNo -- 創建業務數據KEY INSERT INTO [biz_DataKey] ([AreaNo] ,[AppNo] ,[VersionNo] ,[FuncionNo] ,[DateStamp] ,[SerialNo]) VALUES (@AreaNo ,@AppNo ,@VersionNo ,@FunctionNo ,@TodayDate ,@SerialNo) END ELSE BEGIN SET @SerialNo = RIGHT('00000' + CAST((CONVERT(INT,RIGHT(@LastSerialNo,6))+1) AS NVARCHAR(10)),6) SET @ReturnValue = @AreaNo + @AppNo + @VersionNo + @FunctionNo + @TodayDate + @SerialNo -- 更新業務數據KEY UPDATE [biz_DataKey] SET [SerialNo] = @SerialNo ,[LastKeyDate] = GETDATE() WHERE [AreaNo] = @AreaNo AND [AppNo] = @AppNo AND [VersionNo] = @VersionNo AND [FuncionNo] = @FunctionNo AND [DateStamp] = @TodayDate END COMMIT TRANSACTION END TRY BEGIN CATCH ROLLBACK TRANSACTION SET @ReturnValue = '' SELECT ERROR_MESSAGE() END CATCH END GO
執行存儲過程方法:
DECLARE @AppNo NVARCHAR(2) = '30' -- 系統編號 DECLARE @FunctionNo NVARCHAR(10) = '' -- 功能版本號 DECLARE @DataKey NVARCHAR(50) = '' -- DataKey -- 取得DataKey EXEC BiddingConfig.[dbo].[proc_BuildBizDataKey] @AppNo = @AppNo,@FunctionNo = @FunctionNo, @ReturnValue = @DataKey OUTPUT
附加存放流水號表:
CREATE TABLE [dbo].[biz_DataKey]( [AreaNo] [nchar](6) NOT NULL, [AppNo] [nchar](2) NOT NULL, [VersionNo] [nchar](2) NOT NULL, [FuncionNo] [nchar](4) NOT NULL, [DateStamp] [nchar](8) NOT NULL, [SerialNo] [nchar](6) NOT NULL, [LastKeyDate] [datetime] NULL)