SQL Server 存储过程生成流水号

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)
原文地址:https://www.cnblogs.com/kongxiaoshuang/p/6905454.html