-- Sequence table, holds next PK per tableCREATE TABLE dbo.GPK ( table_name SYSNAME NOT NULL PRIMARY KEY, next_value INTEGER NOT NULL );GO-- Example rowINSERT dbo.GPK (table_name, next_value) VALUES (N'dbo.MyTable', 0);GO-- Procedure to allocate a new PKCREATE PROCEDURE dbo.usp_GenPK(@table_name SYSNAME, @NewID INT OUTPUT)AS BEGIN UPDATE dbo.GPK SET @NewID = next_value = next_value + 1 WHERE table_name = @table_name;END;GO-- TestDECLARE @NewID INTEGER;EXEC dbo.usp_GenPK N'dbo.MyTable', @NewID OUTPUT;SELECT @NewID;
-- Sequence table, holds next PK per tableCREATE TABLE dbo.GPK ( table_name SYSNAME NOT NULL PRIMARY KEY, next_value INTEGER NOT NULL );GO-- Example rowINSERT dbo.GPK (table_name, next_value) VALUES (N'dbo.MyTable', 0);GO-- Procedure to allocate a new PKCREATE PROCEDURE dbo.usp_GenPK(@table_name SYSNAME, @NewID INT OUTPUT)AS BEGIN UPDATE GPK SET @NewID = next_value = next_value + 1 WHERE table_name = @table_name;END;GO-- TestDECLARE @NewID INTEGER;EXEC dbo.usp_GenPK N'dbo.MyTable', @NewID OUTPUT;SELECT @NewID;
BEGIN TRANEXEC dbo.usp_GenPK N'dbo.MyTable', @NewID OUTPUT;WAITFOR DELAY '00:02';COMMIT