Хранимая процедура T-SQL, получающая одно и то же значение от счетчика несколько раз - PullRequest
4 голосов
/ 26 мая 2011

Я создал хранимую процедуру, которая должна возвращать уникальный номер, увеличивая значение в таблице каждый раз, когда она вызывается.

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

Иногда хранимая процедура возвращает один и тот же номер дважды. Что я сделал не так?

Ответы [ 2 ]

3 голосов
/ 26 мая 2011

Я делал это раньше:

update CounterTable set @Next_Number = Counter = Counter + 1

, который хранит его в одном выражении, и поэтому (если вы не переключитесь на Read Uncommitted, возможно) не должно быть проблем с несколькими вызывающими.

2 голосов
/ 26 мая 2011

Вы можете явно заблокировать Countertable, используя Таблица Подсказки

...
SET @Current_Number = (
   SELECT CONVERT(int, Counter) 
   FROM CounterTable WITH(Holdlock, Updlock)
)
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...