SQL Server - 重置自定义标识列

时间:2018-01-14 13:26:47

标签: sql sql-server

我有一个包含两列IDSubDetail的表格。我为2018XX列创建了自定义标识ID,其中2018为当前年份,XX为数字,它将从" 01" 。我搜索了一些关于"重置身份字段 - SQL Server"但它只显示了如何重置数字标识字段。我很困惑,无论如何都要重置自定义标识字段。

这是我的SQL查询代码:

CREATE PROCEDURE spAddSubWareHouse
     (@SubDetail VARCHAR(50))
AS
BEGIN
    DECLARE @maxDetailID INT 

    SELECT @maxDetailID = MAX(CAST(RIGHT(ID, 2) AS INT)) 
    FROM SubWareHouse

    IF (@maxDetailID IS NULL)
        SET @maxDetailID = 1 
    ELSE 
        SET @maxDetailID += 1

    --insert
    INSERT INTO SubWareHouse 
    VALUES (CAST(YEAR(GETDATE()) AS VARCHAR) + RIGHT('00' + CAST(@maxDetailID AS VARCHAR), 2), @SubDetail) 
END

1 个答案:

答案 0 :(得分:1)

不要打扰这样做。只需将数字标识列定义为:

id int identity(1, 1) primary key

然后,您可以将year存储为单独的列,因为这似乎是您想要的信息。

为什么这样?原因很多。首先,identity内置于数据库中。因此,即使多个应用程序同时进行插入操作,也确保标识列是唯一的。

其次,对于外键引用,整数更有效(稍微)。

第三,执行您真正想要的操作所需的锁定非常麻烦,并且可能会显着降低系统速度。另外,任何防止重复的实现都可能存在错误 - 那么为什么不使用内置机制?

如果您需要获取给定年份的序列号,使用row_number()很容易:

select row_number() over (partition by year order by id) as year_sequence_number