存储过程以获取下一个渐进ID

时间:2016-03-08 10:30:11

标签: sql sql-server stored-procedures

我不确定在我的应用程序中获取增量ID的最佳做法是什么(依赖SQL Server来保留每个计数器)。 在我的场景中,当应用程序需要一个新的ID时,它会调用我的存储过程,该过程保证获得一个新的,增量的和唯一的ID。 该ID不用作任何表的键,用于应用程序的业务逻辑(更像是令牌)。

EG:我已经读过,使用后续更新选择可能会导致发生故障(关于共享锁定)。 我想在我的实际存储过程中避免它:

declare @Current bigint, @Number bigint

BEGIN TRAN T1
    select @Current = [Counter] from dbo.NumberRange where [Item] = 'Customer'

    SET @Number =  @Current + 1 ;

    UPDATE [dbo].NumberRange
    SET [Counter] =  @Number
    WHERE [Item] = 'Customer'
COMMIT TRAN T1

RETURN @Number;
我错过了什么?有没有正确的方法呢?

1 个答案:

答案 0 :(得分:4)

尝试使用SEQUENCE,它专为此用例设计。

CREATE SEQUENCE [dbo].[MySequence]
  START WITH 0
  INCREMENT BY 1;

UPDATE [dbo].[NumberRange]
SET [Counter] = NEXT VALUE FOR [dbo].[MySequence]
WHERE [Item] = 'Customer';