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

まず、質問のデータに似たデータを宣言します。質問でこれを宣言して、全員が同じデータで作業できるようにすることをお勧めします。このデータには 1 つの違いがあります。デモ用に、EndID が 99999 ではなく 5 になっています。

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の値を表す「スカラー」結果セット (1 列、1 行) を返します。

繰り返し実行の例:

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';

次のシーケンスに類似した 10 個の結果セットを出力する必要があります: 1, 2, 3, 4, 5, 1, 2, .345

于 2012-04-27T13:17:06.373 に答える