SQL Server

Generátor unikátních ID

V době, kdy ještě neexistovaly v SQL serveru sekvence, jsme při vytvoření generátoru unikátních IDček napříč celou databází byli odkázání na lidovou tvořivost. Dnes si ukážeme snad nejjednodušší možné řešení s využitím SCOPE_IDENTITY () a jedné tabulky, která drží naše již použitá IDčka.

Není to nic těžkého a vše funguje poměrně efektivně, pokud správně pracujeme s transakcemi. Ideální je, že nám nevadí, pokud je nějaké ID vygenerováno, ale následně se nepoužije, protože navazující transakce byla odrolována. Pak můžeme jednoduše volat naši proceduru mimo transakci a nemusíme se bát zámků nebo jiných potíží s výkonem vyjma případu, že bychom narazili na omezení na úrovni úložiště nebo interních zámků SQL Serveru (latches), pokud bychom nová IDčka generovali rychlostí několika tisíc a více položek za vteřinu.

Ve skriptu níže si vytvoříme jednoduchou uloženou proceduru, která zapisuje vždy jeden nový řádek do tabulky [dbo].[IdsTable], která drží naše již vygenerovaná IDčka. Procedura nám vrací hodnotu SCOPE_IDENTITY() posledně vloženého záznamu jako výstupní parametr @Id, se kterým již můžeme dále pracovat.  Skript si v ukázce pustíme 10x pomocí GO 10 a jednotlivá IDčka vidíme ve výstupní okně Management Studia.

CREATE TABLE [dbo].[IdsTable]
(
    [Id] INT IDENTITY (1,1) PRIMARY KEY
)
GO

CREATE PROCEDURE [dbo].[GetNewID] 
    @NewId BIGINT OUTPUT
AS
BEGIN
    SET NOCOUNT ON;

    INSERT INTO [dbo].[IdsTable] DEFAULT VALUES
    SET @NewId = SCOPE_IDENTITY()
END
GO

DECLARE @Id INT

EXEC [dbo].[GetNewID] @Id OUTPUT

PRINT @Id
GO 10

Leave a Reply

Your email address will not be published. Required fields are marked *