SQL Server 存储过程生成流水号

Posted 孔小爽

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

 

以上是关于SQL Server 存储过程生成流水号的主要内容,如果未能解决你的问题,请参考以下文章

Java调用SQL Server的存储过程详解(转)

sql server存储过程如何动态生成表名

mysql 生成流水号 存储过程 订单编号

SQL Server存储过程

如何从 SQL Server Management Studio 中的表生成 CRUD 存储过程

Sql Server实现自动增长