Sql server 2012 Sql Server序列号
我需要在SQL server中生成一个分区序列号。目标是让每个部门都有自己的序列,但在一个部门内,数字必须是唯一的。当插入另一条记录时,将分配编号,如果多个用户生成多条记录,则所有序列号必须唯一。我创建了一个表来保存下一个值:Sql server 2012 Sql Server序列号,sql-server-2012,Sql Server 2012,我需要在SQL server中生成一个分区序列号。目标是让每个部门都有自己的序列,但在一个部门内,数字必须是唯一的。当插入另一条记录时,将分配编号,如果多个用户生成多条记录,则所有序列号必须唯一。我创建了一个表来保存下一个值: CREATE TABLE [dbo].[DepartmentSequence]( [DepartmentId] [int] NOT NULL, -- FK to dbo.Department [NextSequenceValue] [int] NOT NU
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 server中的Sequence对象,但它没有帮助,因为每个部门都需要自己独特的序列集。Department是系统中的另一个表,这意味着用户(系统管理员)可以创建任何数字。我已经更新了表/proc,以便更清楚地了解这一点。您正在使用SQL Server 2012。它有一个
序列
对象类型,完全满足您的要求:
CREATE SEQUENCE Department1Sequece
AS int
START WITH 0;
使用:
序列中的值保证是唯一的,除非您指定
循环
,在这种情况下,保证减少为值的一维移动。签出。是的,它将按照您的预期工作-如果回滚事务,则序列中会有一个间隙。SQL 2012+中的序列可能会为您做一些事情:,但您仍然需要手动跟踪各个序列,这样可能不会增加太多。类似的序列表很可能会导致性能问题(我有一个系统使用一个,很容易让长时间运行的进程在这个现在非常关键的表上造成阻塞)。按照建议使用序列
对象。@DStanley,这样即使在事务语句集中使用,过程中的“从更新更改”语句也不会回滚?这不是我想要的。系统的最终用户可以任意创建部门。每次Depa时,我都必须创建一个新序列添加rtment行(如果已删除,则将其删除)。我对问题进行了编辑,以使其更清楚。您是否考虑过为不同部门动态创建和查询序列?或者只为所有部门使用一个序列?动态创建序列将需要不适合从web服务器授予的权限。一个序列不适用于所有部门竞争对手属于客户。
SET @NextValue = NEXT VALUE FOR Department1Sequence