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