Hier ist eine Möglichkeit, es mithilfe einer Tabelle zu tun, um Ihre letzte Sequenznummer zu speichern. Das gespeicherte Proc ist sehr einfach, die meisten Dinge drin sind, weil ich faul bin und keine Überraschungen mag, sollte ich etwas vergessen, so ... hier ist es:
----- Erstellen Sie den Sequenzwert Tabelle.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[SequenceTbl]
(
[CurrentValue] [bigint]
) ON [PRIMARY]
GO
----------------- Erstellen Sie die gespeicherte Prozedur
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
-------- Verwenden die gespeicherte Prozedur in Sql Manager, um einen Testwert abzurufen.
declare @NextInSequence BigInt
exec @NextInSequence = sp_NextInSequence;
--exec @NextInSequence = sp_NextInSequence <skipcount>;
select NextInSequence = @NextInSequence;
----- Zeigt den aktuellen Tabellenwert an.
select * from SequenceTbl;
wird Der aufmerksame bemerken, dass es ein Parameter (optional) für die gespeicherte Prozedur ist. Dadurch kann der Anrufer einen Block von IDs in der Instanz reservieren, in der der Anrufer mehr als einen Datensatz hat, der eine eindeutige ID benötigt - der Anrufer muss mit dem SkipCount nur einen einzigen Anruf tätigen, egal wie viele IDs benötigt werden. Der gesamte Block "IF EXISTS ... INSERT INTO ..." kann entfernt werden, wenn Sie daran denken, beim Erstellen der Tabelle einen Datensatz einzufügen. Wenn Sie auch daran denken, diesen Datensatz mit einem Wert einzufügen (Ihr Startwert - eine Zahl, die niemals als ID verwendet wird), können Sie auch den ISNULL (...) Teil der Auswahl entfernen und einfach CurrentValue + 1 verwenden. Nun, bevor jemand einen Kommentar macht, bitte beachten Sie, dass ich ein Software-Ingenieur bin, nicht ein dba! Also, jede konstruktive Kritik über die Verwendung von "Top 1", "Mit (HoldLock)" und "Mit (UPDLock)" ist willkommen. Ich weiß nicht, wie gut das skalieren wird, aber das funktioniert OK für mich bisher ...
Siehe http://dba.stackexchange.com/questions/3307/emulate-a-tsql-sequence-via-a -stored-procedure – gbn