2

主キーとして使用するシーケンス番号を生成する必要があります (レガシー システムで)

次のソリューションが競合状態で同時実行性に悩まされているかどうかを知りたいです。

CREATE TABLE SequenceGenerator
(
    Sequence INT
)

INSERT INTO SequenceGenerator SELECT 0

そして、次のシーケンス番号が必要になるたびに呼び出すストアド プロシージャを次に示します。

CREATE PROCEDURE GetNextSequence
AS
    SET NOCOUNT ON
    DECLARE @NextSequence INT
    UPDATE SequenceGenerator SET
    @NextSequence = Sequence,
    Sequence = Sequence + 1
    RETURN @NextSequence + 1

ありがとう

4

4 に答える 4

1

これでうまくいきます。並行性の問題に遭遇することはありません。

CREATE TABLE SequenceGenerator(Sequence INT)
GO
INSERT INTO SequenceGenerator SELECT 0
GO

DECLARE @NextSequence INT

UPDATE SequenceGenerator 
SET @NextSequence = Sequence = Sequence + 1

@NextSequence の値が増加します

于 2013-01-18T13:55:23.657 に答える
0

きれいではありませんが、私は何年も SQL Server 2008 R2 で次の作業を行ってきましたが、決してがっかりすることはありません。

「名前」と「LastValue」列を持つテーブルがあります。

CREATE PROCEDURE [dbo].[ReserveSequence]
@Name varchar(100),
@Count int,
@FirstValue bigint OUTPUT
AS 
BEGIN
SET NOCOUNT ON;

DECLARE @Results TABLE ([LastValue] bigint)

UPDATE [Sequences]
SET [LastValue] = [LastValue] + @Count
OUTPUT INSERTED.LastValue INTO @Results
WHERE [Name] = @Name;

SELECT TOP 1 @FirstValue = [LastValue] + 1 FROM @Results;
RETURN 0;
END

そうは言っても、2012年以降をターゲットにしている場合は、 SEQUENCE オブジェクトを使用しています。

于 2013-01-08T17:34:39.350 に答える