1

我需要使用这样的现有表格来促进滚动计数器:-

CREATE TABLE [dbo].[IdentityCounter](
    [CounterName] [nvarchar](255) NOT NULL,
    [StartId] [bigint] NOT NULL,
    [EndId] [bigint] NOT NULL,
    [CurrentId] [bigint] NOT NULL,
    [CreatedTime] [datetime] NULL,
    [ModifiedTime] [datetime] NULL,
    [Description] [nvarchar](255) NULL
) ON [PRIMARY]

例如说我有以下内容: -

 CounterName  "ReceiptNumber"
 StartId  1
 EndId  99999 
 etc. etc.

对于特定的 CounterName 我希望能够调用存储过程或函数来: -

  • 为我获取下一个值并将其保存回 CurrentId 并将 CurrentId 作为结果发回

  • 如果下一个值等于 EndId + 1,那么我需要使下一个值等于 StartId 并将其保存回 CurrentId。还将 CurrentId 作为结果发回。

  • 将有多个应用程序调用它,因此需要确保事情保持一致。

计数器不是钥匙,它只是需要传递给第三方服务的东西。

最好的方法是什么?

谢谢!ITG

4

1 回答 1

1

首先,我声明的数据看起来像您问题中的数据。如果您在问题中声明这一点会更好,以便我们都使用相同的数据。数据有一个区别:出于演示目的,EndID 是 5 而不是 99999。

INSERT INTO dbo.IdentityCounter(
  CounterName,
  StartID,
  EndID,
  CurrentID
)
VALUES (
  N'ReceiptNumber',
  1,
  5,
  1
);

此过程可以满足您的要求:

CREATE PROCEDURE dbo.IncrementCounter (
  @CounterName NVARCHAR(255)
)
AS
BEGIN
  SET NOCOUNT ON;

  UPDATE dbo.IdentityCounter
  SET CurrentID = CASE WHEN CurrentID = EndID THEN StartID ELSE CurrentID + 1 END
  OUTPUT DELETED.CurrentID
  WHERE CounterName = @CounterName;
END;

它返回一个“标量”结果集(一列,一行),它表示CurrentID在计数器递增之前给定 CounterName 的值。

重复执行示例:

EXEC dbo.IncrementCounter
  @CounterName = 'ReceiptNumber';
EXEC dbo.IncrementCounter
  @CounterName = 'ReceiptNumber';
EXEC dbo.IncrementCounter
  @CounterName = 'ReceiptNumber';
EXEC dbo.IncrementCounter
  @CounterName = 'ReceiptNumber';
EXEC dbo.IncrementCounter
  @CounterName = 'ReceiptNumber';
EXEC dbo.IncrementCounter
  @CounterName = 'ReceiptNumber';
EXEC dbo.IncrementCounter
  @CounterName = 'ReceiptNumber';
EXEC dbo.IncrementCounter
  @CounterName = 'ReceiptNumber';
EXEC dbo.IncrementCounter
  @CounterName = 'ReceiptNumber';
EXEC dbo.IncrementCounter
  @CounterName = 'ReceiptNumber';

应该输出十个与此序列相似的结果集:1, 2, 3, 4, 5, 1, 2, 3, 4, 5.

于 2012-04-27T13:17:06.373 回答