2014-12-19 2 views
2

Мне нужно создать секционированный порядковый номер на 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, чтобы получить более четкое представление об этом.

+0

Да, он будет работать так, как вы ожидаете, - если транзакция отменяется, тогда у вас будет пробел в последовательности. –

+0

SEQUENCE в SQL 2012+ может сделать бит для вас: http://msdn.microsoft.com/en-us/library/ff878091.aspx, хотя вам все равно нужно будет отслеживать отдельные последовательности вручную, чтобы он мог не добавляйте много. –

+0

Таблица последовательности, подобная этой, очень вероятно приведет к проблемам с производительностью (у меня есть система, которая ее использует, очень легко получить длительные процессы, чтобы вызвать блокировку этой критически важной таблицы). Используйте объект 'SEQUENCE', как было рекомендовано. – alroc

ответ

0

Вы работаете в SQL Server 2012. Она имеет тип SEQUENCE объект, который делает именно то, что вы хотели:

CREATE SEQUENCE Department1Sequece 
AS int 
START WITH 0; 

Использование:

SET @NextValue = NEXT VALUE FOR Department1Sequence 

Значения из последовательности гарантированно быть уникальным , если вы не укажете CYCLE, и в этом случае гарантия сводится к одномерному перемещению значений. Выезд MSDN.

+0

Это не совсем то, что я хочу; отделы могут быть созданы произвольно конечными пользователями системы. Мне пришлось бы создавать новую последовательность всегда, когда добавляется строка отдела (и удаляем ее, если она удалена). Я отредактировал вопрос, чтобы сделать это более ясным. – Andy

+0

Рассматривали ли вы динамическое создание и запрос последовательностей для разных отделов? Или просто используйте одну последовательность для всех отделов? –

+0

Динамическое создание последовательностей потребует привилегий, не соответствующих предоставлению с веб-сервера. Одна последовательность для всех не может быть и речи, поскольку отделы принадлежат клиентам, которые являются конкурентами. – Andy

Смежные вопросы