Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

SQL Server 2005 - utilisant des séquences générées au lieu de colonnes d'identité ?

Oui, SQL 11 a des objets SEQUENCE, voir SQL Server v.Next (Denali) :Utilisation de SEQUENCE .

La création de séquences manuelles est possible, mais non recommandée. L'astuce pour faire un générateur de séquences est d'utiliser UPDATE WITH OUTPUT sur une table de séquences. Voici le pseudo-code :

CREATE TABLE Sequences (
    Name sysname not null primary key, 
    Sequence bigint not null default 0);
GO

CREATE PROCEDURE sp_getSequence
    @name sysname,
    @value bigint output
AS
    UPDATE Sequences
    SET Sequence = Sequence + 1
     OUTPUT @value = INSERTED.Sequence
    WHERE Name = @name;
GO

J'ai omis quelques détails, mais c'est l'idée générale. Cependant, il y a un énorme problème :toute transaction demandant la valeur suivante sur une séquence sera verrouillée cette séquence jusqu'à ce qu'elle soit validée, car elle placera un verrou de mise à jour sur la valeur de la séquence. Cela signifie que tous les transactions doivent se sérialiser les unes après les autres lors de l'insertion de valeurs et la dégradation des performances qui en résulte est insupportable dans les déploiements de production réels.

Je préférerais de loin que vous vous en teniez aux types IDENTITY. Bien qu'ils ne soient pas parfaits, ils sont bien meilleurs que ce que vous pouvez réaliser par vous-même.