我有一个包含两列ID
和SubDetail
的表格。我为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
答案 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