Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

SQL Server 2005:utilizzo di sequenze generate anziché colonne Identity?

Sì, SQL 11 ha oggetti SEQUENCE, vedi SQL Server v.Next (Denali):utilizzo di SEQUENCE .

La creazione di sequenze manuali è possibile, ma non consigliata. Il trucco per creare un generatore di sequenze consiste nell'utilizzare UPDATE WITH OUTPUT su una tabella di sequenze. Ecco lo pseudo-codice:

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

Ho tralasciato alcuni dettagli, ma questa è l'idea generale. Tuttavia, c'è un grosso problema:qualsiasi transazione che richiede il valore successivo su una sequenza si bloccherà quella sequenza fino a quando non viene eseguito il commit, perché inserirà un blocco di aggiornamento sul valore della sequenza. Ciò significa che tutti le transazioni devono essere serializzate una dopo l'altra quando si inseriscono valori e il degrado delle prestazioni che ne risulta è insopportabile nelle implementazioni di produzione reali.

Preferirei di gran lunga che ti attenessi ai tipi IDENTITY. Sebbene non siano perfetti, sono di gran lunga migliori di quello che puoi ottenere da solo.