T-SQL 使用触发器或函数创建自定义列

T-SQL Create Customized Column with Trigger or Function

我正在处理数据库列,我在触发器和函数之间做出决定我相信其中之一是我需要的,因为我认为存储过程不能在插入后 运行。不过,我对任何建议持开放态度,我有一个列需要一个字符串值,然后是 2 位数的当前年份,后跟一个 – 和一个计数器。在新的一年开始时,我需要重新启动计数器 001.我应该怎么做?

EX。 VSP20-001、VSP20-002 ……以及下一年,VSP21-001、VSP21-002 ……

这是我的触发器的开始。我知道它需要更多。我不确定我是否应该将其作为计算列来完成,或者我是否可以仅在 1 列中完成所有操作。

CREATE TRIGGER trg_ProposalTest
ON dbo.Serv_Quotes
AFTER INSERT
AS
BEGIN
    DECLARE @yearTst nvarchar(10);
    SET @yearTst = (SELECT FORMAT(GETDATE(), 'yy'))

    DECLARE @word nvarchar(5);
    SET @word = 'VSP';

    DECLARE @counter int;
    SET @counter = RIGHT(@fullvar,3) + 1; -- still need to create this

作为替代方法,您可以在使用 SEQUENCE 对象的列上使用默认值来完成这一切。 (不幸的是,您不能在计算列中使用序列。无法解释这种区别。)

您可以为最终值创建一个简单的序列,然后在默认值的定义中将其余值连接在一起。

为了在您的年度重置中循环它,创建一个 SQL 代理作业(或任何您的计划工具)到 运行 一个 ALTER 语句来重置序列。

create sequence dbo.ProjID
AS INTEGER
START WITH 10
INCREMENT BY 1;

GO

create table testseq (
    ID bigint identity(1,1) not null,
    val int,
    testVal nvarchar(10) default ( CONCAT( 'VSP', YEAR( GETDATE() ) % 100 , '-', 
                                   RIGHT( CONCAT('000', NEXT VALUE FOR dbo.ProjID), 3)))
);

GO

insert testseq (val) values (1), (2);

select * from testseq;

结果:

+----+-----+-----------+
| ID | val |  testVal  |
+----+-----+-----------+
|  1 |   1 | VSP20-010 |
|  2 |   2 | VSP20-011 |
+----+-----+-----------+

然后,每年1月1日:

ALTER SEQUENCE dbo.ProjID
  RESTART;

在这里试一试,看看你的想法。

Rextester Demo.