我需要在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以更加清楚这一点。
答案 0 :(得分:0)
您正在使用SQL Server 2012.它具有SEQUENCE
对象类型,可以完全按照您的需要执行操作:
CREATE SEQUENCE Department1Sequece
AS int
START WITH 0;
使用:
SET @NextValue = NEXT VALUE FOR Department1Sequence
序列中的值保证是唯一的,除非您指定CYCLE
,在这种情况下,保证会减少到值的一维移动。查看MSDN。