• 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)
  • 相关阅读:
    隔壁小孩都要知道的Drupal配置
    Cobaltstrike、armitage联动
    YxCMS 1.4.7 最新版漏洞分析
    业务逻辑漏洞探索之暴力破解
    刺透内网的HTTP代理
    pwn入门之栈溢出练习
    史上最完整的MySQL注入
    ISG 2018 Web Writeup
    3-4 计算长方形的周长和面积
    【Lucene4.8教程之二】索引
  • 原文地址:https://www.cnblogs.com/kongxiaoshuang/p/6905454.html
Copyright © 2020-2023  润新知