这是一种使用表格来存储您的最后一个序列号的方法。存储过程非常简单,里面的大部分东西都是因为我很懒,如果我忘记了什么不喜欢惊喜,所以......这里是:
----- 创建序列值表。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[SequenceTbl]
(
[CurrentValue] [bigint]
) ON [PRIMARY]
GO
-----------------创建存储过程
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE procedure [dbo].[sp_NextInSequence](@SkipCount BigInt = 1)
AS
BEGIN
BEGIN TRANSACTION
DECLARE @NextInSequence BigInt;
IF NOT EXISTS
(
SELECT
CurrentValue
FROM
SequenceTbl
)
INSERT INTO SequenceTbl (CurrentValue) VALUES (0);
SELECT TOP 1
@NextInSequence = ISNULL(CurrentValue, 0) + 1
FROM
SequenceTbl WITH (HoldLock);
UPDATE SequenceTbl WITH (UPDLOCK)
SET CurrentValue = @NextInSequence + (@SkipCount - 1);
COMMIT TRANSACTION
RETURN @NextInSequence
END;
GO
--------使用 Sql Manager 中的存储过程来检索测试值。
declare @NextInSequence BigInt
exec @NextInSequence = sp_NextInSequence;
--exec @NextInSequence = sp_NextInSequence <skipcount>;
select NextInSequence = @NextInSequence;
-----显示当前表值。
select * from SequenceTbl;
精明的人会注意到存储过程有一个参数(可选)。这是为了允许调用者在调用者有多个需要唯一 id 的记录的情况下保留一个 ID 块 - 使用 SkipCount,调用者只需调用一次即可,但需要许多 ID。如果您记得在创建表时插入一条记录,则可以删除整个“IF EXISTS...INSERT INTO...”块。如果您还记得使用值插入该记录(您的种子值 - 一个永远不会用作 ID 的数字),您还可以删除选择的 ISNULL(...) 部分并仅使用 CurrentValue + 1。现在,在任何人发表评论之前,请注意我是软件工程师,而不是dba!所以,任何建设性的欢迎批评使用“Top 1”、“With (HoldLock)”和“With (UPDLock)”。我不知道这将如何扩展,但到目前为止这对我来说还可以......