Voici une façon de le faire en utilisant une table pour stocker votre dernier numéro de séquence. Le proc stocké est très simple, la plupart des choses sont là parce que je suis fainéant et n'aime pas les surprises si j'oublie quelque chose alors ... voici:
----- Créer la valeur de la séquence table.
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[SequenceTbl]
(
[CurrentValue] [bigint]
) ON [PRIMARY]
GO
----------------- Créer la procédure stockée
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
-------- Utilisation la procédure stockée dans Sql Manager pour récupérer une valeur de test.
declare @NextInSequence BigInt
exec @NextInSequence = sp_NextInSequence;
--exec @NextInSequence = sp_NextInSequence <skipcount>;
select NextInSequence = @NextInSequence;
----- Affiche la valeur de la table en cours.
select * from SequenceTbl;
L'astérisque remarquera qu'il existe un paramètre (optionnel) pour le proc mémorisé. Cela permet à l'appelant de réserver un bloc d'ID dans l'instance où l'appelant a plus d'un enregistrement nécessitant un ID unique. En utilisant le SkipCount, l'appelant n'a besoin de faire qu'un seul appel, quel que soit son ID. L'intégralité du bloc "IF EXISTS ... INSERT INTO ..." peut être supprimé si vous pensez à insérer un enregistrement lors de la création de la table. Si vous pensez également à insérer cet enregistrement avec une valeur (votre valeur initiale - un nombre qui ne sera jamais utilisé comme ID), vous pouvez également supprimer la partie ISNULL (...) de la sélection et utiliser simplement CurrentValue + 1. Maintenant, avant que quelqu'un ne fasse un commentaire, s'il vous plaît noter que je suis un ingénieur logiciel, pas un dba! Donc, toute critique constructive concernant l'utilisation de "Top 1", "With (HoldLock)" et "With (UPDLock)" est la bienvenue. Je ne sais pas à quel point cela va évoluer mais cela fonctionne bien pour moi jusqu'ici ...
Voir http://dba.stackexchange.com/questions/3307/emulate-a-tsql-sequence-via-a -stored-procedure – gbn