MSSQLが高く、連続して重複しない注文番号を発行します.

8990 ワード

参照先:
https://www.cnblogs.com/h-change/p/6699683.html
ここでデータベースレベルで生成されたものは、テストでは重複しません.
自分で修正したバージョンを添付します.ここでは1年分の記録を作成することもできます.プロセスは直接読むことができます.表には必ずデータがあると思います.
--  rq date num int    

GO
CREATE PROC dbo.proc_CreateNewDH
AS 
    SET NOCOUNT ON
    DECLARE
        @TranCount INT=0,
        @Error INT=0,
        @MaxNum INT=0,
        @ErrorMsg VARCHAR(MAX),
        @rq DATE=CONVERT(VARCHAR(10), GETDATE(), 121)    
    BEGIN TRY
    
    BEGIN TRAN
        SET @TranCount=1
        
        SELECT @MaxNum=Num+1
        FROM dhlist WITH(ROWLOCK, UPDLOCK)  -- 
        WHERE rq=@rq
        SET @MaxNum=ISNULL(@MaxNum,0)    
        IF @MaxNum=0
        BEGIN
            INSERT INTO dbo.dhlist (rq,Num) VALUES(@rq, 1)
            SET @MaxNum=1
        END
        ELSE
            UPDATE dhlist  SET Num=Num+1 WHERE rq=@rq        
    END TRY
    BEGIN CATCH 
    
        SET @Error=@@ERROR
        SET @ErrorMsg=ERROR_MESSAGE()
        IF @TranCount=1
        BEGIN            
            ROLLBACK TRAN    
            --PRINT 'ROLLBACK TRAN'
            --PRINT @Error
            --PRINT @TranCount
        END
        RAISERROR(@ErrorMsg, 19, 1)     WITH LOG
        RETURN
    END CATCH    
        
    IF @TranCount=1 AND @Error=0
        COMMIT TRAN
        
    IF LEN(CAST(@MaxNum AS VARCHAR))<=4
        SELECT 'XXX'+CONVERT(VARCHAR,GETDATE(),12)+RIGHT('0000'+CAST(@MaxNum AS VARCHAR), 4) AS dh
    ELSE
        SELECT 'XXXX'+CONVERT(VARCHAR,GETDATE(),12)+RIGHT('000000'+CAST(@MaxNum AS VARCHAR), 6) AS dh

    SET NOCOUNT OFF
GO