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)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM