Мне нужно создать секционированный порядковый номер на SQL-сервере. Цель состоит в том, чтобы каждый отдел имел свою собственную последовательность, но внутри отдела номера должны быть уникальными. Номера присваиваются при вставке другой записи, и если несколько пользователей создают несколько записей, все порядковые номера должны быть уникальными. Я создал таблицу для хранения следующего значения:Sql Последовательный номер сервера
CREATE TABLE [dbo].[DepartmentSequence](
[DepartmentId] [int] NOT NULL, -- FK to dbo.Department
[NextSequenceValue] [int] NOT NULL,
CONSTRAINT [PK_Sequence_DepartmentId] PRIMARY KEY CLUSTERED([DepartmentId] ASC)
И хранимую процедуру:
CREATE PROCEDURE [dbo].[apGetNextSequenceNumber] @DepartmentId int AS
BEGIN
SET NOCOUNT ON;
DECLARE @result INT
UPDATE dbo.DepartmentSequence
SET @result = NextSequenceValue,
NextSequenceValue = NextSequenceValue + 1
WHERE DepartmentId = @DepartmentId
RETURN @result
END
Будет ли эта функция, как я ожидаю? Как насчет того, используется ли она в транзакции, которая позже откат?
EDIT: Я просмотрел объект Sequence на SQL-сервере, но это не помогает, поскольку каждый отдел нуждается в своем уникальном наборе последовательностей. Департамент - еще одна таблица в системе, что означает, что любое число может быть создано пользователями (системными администраторами). Я обновил таблицу/proc, чтобы получить более четкое представление об этом.
Да, он будет работать так, как вы ожидаете, - если транзакция отменяется, тогда у вас будет пробел в последовательности. –
SEQUENCE в SQL 2012+ может сделать бит для вас: http://msdn.microsoft.com/en-us/library/ff878091.aspx, хотя вам все равно нужно будет отслеживать отдельные последовательности вручную, чтобы он мог не добавляйте много. –
Таблица последовательности, подобная этой, очень вероятно приведет к проблемам с производительностью (у меня есть система, которая ее использует, очень легко получить длительные процессы, чтобы вызвать блокировку этой критически важной таблицы). Используйте объект 'SEQUENCE', как было рекомендовано. – alroc