我有一个非常有趣的问题。我正在尝试基于“ 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存储在其中。
这是解决问题的正确方法吗?请给我建议解决的可能方法。
提前感谢。
如果您愿意在表中添加另一列来记录插入记录时的当前日期时间,则可以使用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