「MicrosoftSQLServer2008の内部:T-SQLクエリ」からのこの問題の解決策
CREATE TABLE dbo.Sequence(
val int IDENTITY (10000, 1) /*Seed this at whatever your current max value is*/
)
GO
CREATE PROC dbo.GetSequence
@val AS int OUTPUT
AS
BEGIN TRAN
SAVE TRAN S1
INSERT INTO dbo.Sequence DEFAULT VALUES
SET @val=SCOPE_IDENTITY()
ROLLBACK TRAN S1 /*Rolls back just as far as the save point to prevent the
sequence table filling up. The id allocated won't be reused*/
COMMIT TRAN
または、同じ本の別の方法で範囲を簡単に割り当てることができます。 (これをトランザクションの内部から呼び出すか外部から呼び出すかを検討する必要があります。内部では、最初のトランザクションがコミットされるまで、他の同時トランザクションがブロックされます)
CREATE TABLE dbo.Sequence2(
val int
)
GO
INSERT INTO dbo.Sequence2 VALUES(10000);
GO
CREATE PROC dbo.GetSequence2
@val AS int OUTPUT,
@n as int =1
AS
UPDATE dbo.Sequence2
SET @val = val = val + @n;
SET @val = @val - @n + 1;