zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    React在componentDidMount里面发送请求
    React 术语词汇表
    React里受控与非受控组件
    React和Vue等框架什么时候操作DOM
    【LeetCode】79. Word Search
    【LeetCode】91. Decode Ways
    【LeetCode】80. Remove Duplicates from Sorted Array II (2 solutions)
    【LeetCode】1. Two Sum
    【LeetCode】141. Linked List Cycle (2 solutions)
    【LeetCode】120. Triangle (3 solutions)
  • 原文地址:https://www.cnblogs.com/kongxiaoshuang/p/6905454.html
Copyright © 2011-2022 走看看