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)