基于主键,当前年份和上一年的值自动生成字段的值

问题描述 投票:0回答:1

我有一个非常有趣的问题。我正在尝试基于“ ID”(主键字段)的值来为“名称”字段生成值。

例如,

'ID'为142

“名称”将为19142。“ 19”表示当前年份。

为此,我编写了以下触发器(效果很好):

CREATE TRIGGER [dbo].[GenerateTheName]
ON [dbo].[Table1]
AFTER INSERT
AS
BEGIN

UPDATE [dbo].[Table1]

SET [Name] = (SELECT FORMAT(GETDATE(),'yy')) +
             (SELECT CAST(FORMAT([ID],'000','en-US') AS VARCHAR(4)) FROM inserted)

WHERE ID = (Select [id] FROM inserted)

END

现在,当年份更改时,“名称”字段的值中的id部分需要从零重新开始,而实际ID应该跟在身份之后,并像往常一样增加1。

因此,如果2019年的最后一条记录的ID = 164,则2020年的第一条记录应该是:

ID:165名称:20001

实现此目的的一种方法是创建一个新表,例如'table2',并通过触发器在其中存储本年(2019)的'ID'的最后一个值。然后在整个2020年,此记录的数据可用作参考。

因此,如果2020年的第一条记录具有ID:165在'table1'中插入新记录后,另一个触发器将从'ID'的值中减去table2中的唯一值(164)。

165-164=1
166-164=2
167-164=3
....

[当2020年也结束时,只会删除'table2'中的该记录,并再次将2020年的最后一个ID存储在其中。

这是解决问题的正确方法吗?请给我建议解决的可能方法。

提前感谢。

sql sql-server database triggers auto-generate
1个回答
1
投票

如果您愿意在表中添加另一列来记录插入记录时的当前日期时间,则可以使用1个表和1个触发器来完成。示例代码-

CREATE TABLE Table1 (ID INT IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(20), CreatedDateTime DATETIMEOFFSET(7) DEFAULT SYSDATETIMEOFFSET())
GO

CREATE TRIGGER [dbo].[GenerateTheName]
ON [dbo].[Table1]
AFTER INSERT
AS
BEGIN


UPDATE [dbo].[Table1]
SET [Name] = (SELECT FORMAT(GETDATE(),'yy')) + (SELECT FORMAT((ISNULL(MAX(Id), 0) + 1), '000', 'en-US') FROM Table1 WHERE CreatedDateTime > DATEADD(yy, DATEDIFF(yy, 0, (SELECT CreatedDateTime FROM inserted)), 0)
AND CreatedDateTime < (SELECT CreatedDateTime FROM inserted))
WHERE ID = (Select [id] FROM inserted)

END

insert into table1 (createddatetime) values (sysdatetimeoffset())
insert into table1 (createddatetime) values (sysdatetimeoffset())

select * from table1 -- Gives 19001 and 19002 as name
© www.soinside.com 2019 - 2024. All rights reserved.