T-SQL存储过程多次从计数器获得相同的值

问题描述

| 我创建了一个存储过程,该存储过程应该通过在每次调用表时增加表中的值来返回唯一数字。
ALTER PROCEDURE [dbo].[GetNextNumber] @Next_Number char(9) output AS
BEGIN
    BEGIN TRAN

    DECLARE @Current_Number int
    SET @Current_Number = (SELECT CONVERT(int,Counter) FROM CounterTable)

    IF(@Current_Number IS NULL)
    BEGIN
        SET @Next_Number = \'000000000\'
        INSERT INTO CounterTable (Counter) VALUES (@Next_Number)
    END
    ELSE IF(@Current_Number >= 999999999)
    BEGIN
         SET @Next_Number = \'000000000\'
         UPDATE dbo.CounterTable SET Counter = @Next_Number
    END
    ELSE
    BEGIN
        SET @Next_Number = REPLACE(STR(@Current_Number + 1,9),\' \',\'0\')
        UPDATE dbo.CounterTable SET Counter = @Next_Number
    END

    COMMIT TRAN
END
有时,存储过程两次返回相同的数字。我做错了什么?     

解决方法

我之前已经这样做:
update CounterTable set @Next_Number = Counter = Counter + 1
这样可以将其保存在单个语句中,因此(除非您可能切换为“读取未提交”),否则多个调用方都不会出现问题。     ,您可以使用表格提示显式锁定ѭ2
...
SET @Current_Number = (
   SELECT CONVERT(int,Counter) 
   FROM CounterTable WITH(Holdlock,Updlock)
)
...