SQL——触发器——插入触发器——边学边项目写的。

时间:2023-03-08 16:03:09

需求:

项目表项目编码触发器编写

为项目表DwProject编写触发器,目的为当创建新项目时,且ProjectNo

为Null或空字符串时,自动创建项目编号,编号格式为4位年号,2位月份,2位顺序号,如20160301。具体要求如下:

1、触发器名称Tig_Project_Number。

2、仅Insert时触发。

3、触发器前6位为GetDate取值当前年和月,如201603,后两位为当前月的最后一个项目顺序号 1。

4、暂不考虑批量插入,不使用游标。

5、首先在192.168.1.113编写及测试,确定没问题后审核并部署在114服务器。

触发器编写完成后将现有所有项目编号重新按照触发器定义的格式重新编码。

ALTER trigger [dbo].[Tig_Project_Number]
on [dbo].[DwProject] after insert --插入类型
as
--声明4个变量
DECLARE @Title varchar(6)
DECLARE @dateYm varchar(20)
DECLARE @TitleNumber varchar(8)
DECLARE @TitleSessess varchar(8)
SET @dateYm= CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112)--得到格式为20160101的时间。
SET @Title = SUBSTRING(@dateYm, 1, 6)--字符串截取1-6个(非从0开始)
set @TitleNumber=(select Max(ProjectNo) from DwProject where ProjectNo like @Title+'%')--取出已有最大编号,如果没有为空。
--如果插入为空或者NULL。
if((select ProjectNo from inserted)='' or (select ProjectNo from inserted)is NULL)
begin
--如果查询到历史编码—————历史编码+1
if(len(@TitleNumber)>6 and @TitleNumber is not null )
begin
set @TitleSessess=(select convert(int,@TitleNumber)+1)
end
else --否则直接用 201612 格式 + 第一个顺序号 01
begin
Set @TitleSessess=@Title+'01'
end
update DwProject set ProjectNo=@TitleSessess where Id=(select Id from inserted)
end--如果插入为空或者NULL。结束标记。

 修改版

ALTER TRIGGER [dbo].[Tig_Project_Number]
ON [dbo].[DwProject] AFTER INSERT --插入类型
AS
--声明4个变量
DECLARE @Title VARCHAR(6)
DECLARE @dateYm VARCHAR(20)
DECLARE @TitleNumber VARCHAR(8)
DECLARE @TitleSessess VARCHAR(8)
SET @dateYm= CONVERT(CHAR(8), CURRENT_TIMESTAMP, 112)--得到格式为20160101的时间。
SET @Title = SUBSTRING(@dateYm, 1, 6)--字符串截取1-6个(非从0开始)
SET @TitleNumber=(SELECT Max(ProjectNo) FROM DwProject WHERE ProjectNo like @Title+'%')--取出已有最大编号,如果没有为空。
--如果插入为空或者NULL。
IF((SELECT ProjectNo FROM inserted)='' or (SELECT ProjectNo FROM inserted)is NULL)
BEGIN
--如果查询到历史编码—————历史编码+1
IF(len(@TitleNumber)>6 and @TitleNumber is not null )
SET @TitleSessess=(SELECT convert(int,@TitleNumber)+1)
--否则直接用 201612 格式 + 第一个顺序号 01
ELSE
SET @TitleSessess=@Title+'01'
UPDATE DwProject SET ProjectNo=@TitleSessess WHERE Id=(SELECT Id FROM inserted)
END--如果插入为空或者NULL。结束标记。

  心得:格式化了一下,去掉了单行的 BEGIN END