Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2012 Sql Server序列号_Sql Server 2012 - Fatal编程技术网

Sql server 2012 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

我需要在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 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