Sql Server序列号

时间:2014-12-19 17:45:07

标签: sql-server-2012

我需要在SQL server中生成分区序列号。目标是让每个部门都有自己的顺序,但在部门内,数字必须是唯一的。插入另一条记录时会分配这些数字,如果多个用户生成多条记录,则所有序列号必须是唯一的。我创建了一个表来保存下一个值:

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

这会像我期望的那样发挥作用吗?如果它在后来回滚的事务中使用呢?

编辑:我已经查看了SQL服务器中的Sequence对象,但它并没有帮助,因为每个部门都需要自己独特的序列集。 Department是系统中的另一个表,意味着用户(系统管理员)可以创建任何数字。我已经更新了表/ proc以更加清楚这一点。

1 个答案:

答案 0 :(得分:0)

您正在使用SQL Server 2012.它具有SEQUENCE对象类型,可以完全按照您的需要执行操作:

CREATE SEQUENCE Department1Sequece
AS int
START WITH 0;

使用:

SET @NextValue = NEXT VALUE FOR Department1Sequence

序列中的值保证是唯一的,除非您指定CYCLE,在这种情况下,保证会减少到值的一维移动。查看MSDN