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;
在这里试一试,看看你的想法。
我正在处理数据库列,我在触发器和函数之间做出决定我相信其中之一是我需要的,因为我认为存储过程不能在插入后 运行。不过,我对任何建议持开放态度,我有一个列需要一个字符串值,然后是 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;
在这里试一试,看看你的想法。