создать идентификатор таблицы в isql - PullRequest
0 голосов
/ 22 июля 2010

Моя компания генерирует разные читаемые идентификаторы для каждой таблицы в базе данных в формате [префикс] - [инкрементный идентификатор]

т.е.

Инвентарь => ИНВ-0001, ИНВ-0002; (ИНКРЕМЕНТНЫЙ) Продукты => ПРОД-0001, ПРОД-0002, ПРОД-0003; (INCREMENTAL)

Проблема, с которой я сталкиваюсь, заключается в том, что идентификаторы генерируются в коде c #, а не в базе данных, поэтому очень трудно вставить новую запись в базу данных через Trigger. Я ищу подход, который помог бы мне решить эту проблему.

1 Ответ

0 голосов
/ 22 июля 2010

Инкапсулируйте генерацию идентификатора в одну или несколько хранимых процедур и используйте их как со стороны клиента, так и со стороны T-SQL.

-- ======================================================================
-- id table
CREATE TABLE Ids (
   Name VARCHAR(30) PRIMARY KEY CLUSTERED
   ,NextId INT NOT NULL
);
-- ======================================================================
-- init ids for Inventory
INSERT INTO Ids VALUES('Inventory', 1);
GO
-- ======================================================================
-- general procedure to allocate new ids
ALTER PROCEDURE AllocateIds
   @nextId INT OUTPUT
   ,@name VARCHAR(30)
   ,@count INT
AS
SET NOCOUNT ON;

UPDATE Ids SET
   @nextId = NextId
   ,NextId += @count
WHERE Name = @name
GO
-- ======================================================================
-- special procedure to get new inventory ids
ALTER PROCEDURE GetInventoryId
   @inventoryId VARCHAR(30) OUTPUT
AS
SET NOCOUNT ON;

DECLARE @nextId INT;
EXECUTE AllocateIds @nextId OUTPUT, 'Inventory', 1;

SET @inventoryId = 'INV-' + REPLICATE('0', 4 - LEN(CAST(@nextId AS VARCHAR(20)))) + CAST(@nextId AS VARCHAR(20));
GO
-- ======================================================================
-- sample usage
DECLARE @inventoryId VARCHAR(30);
EXECUTE GetInventoryId @inventoryId OUTPUT;
PRINT @inventoryId;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...