接上以前的触发器实例,现在面临了另一个问题,之前做的触发器是按照当前年份条数去给他设置后面对应的序号的,但是会有如图017和018创建好了之后,他把017给删除了,那么当前年份的条数就变成了17条,在新建好保存的时候会提示编号重复,原因也很简单,当使用年份条数作为计数器的时候,条数和序号可能存在不符的情况(中间删除),这一种特殊情况只能特殊处理掉,下面是代码,其中只额外添加了一个去除左边为0的方法
这边给大家讲解一下
当有字符串01001的时候,这个是序号,我们需要获取的值是1001,也就是去除左边的0,这个时候采取的操作是先替换,然后LTRIM去除空格,然后再次替换,也就是replace(ltrim(replace(A,‘0’,’ ‘)),’ ‘,‘0’)
其中替换是将0替换成空格(注意不是’'空值)
USE [YFERP_HH]
GO
/****** Object: Trigger [dbo].[cghtspbh] Script Date: 2020-03-04 11:19:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[cghtspbh]
on [dbo].[采购合同审批表]
after insert
as
begin
declare @number int;
declare @String char(17);
declare @String2 char(20);
declare @number2 int;
declare @number3 char(3);
select @number2=(select top 1 replace(ltrim(replace(rtrim(ltrim(substring(合同编号,11,13))),'0',' ')),' ','0') from 采购合同审批表
where substring(合同编号,3,4)=YEAR(getdate()) order by 合同编号 desc)
//获取当前最新的编号,截取其中最后3位(计数位),去除0后化作INT类型做比较
select @number=(select count(*) from 采购合同审批表
where substring(合同编号,3,4)=YEAR(getdate())
)
//获取当前一共有多少条符合的数据个数
if(@number2 >=@number) //如果最新的编号计数>符合的条数(存在中间删除的情况)
begin
select @number2=@number2+1;//最新计数器+1作为计数编码
select @number3=(
select distinct case when @number2<10 then '00'+convert(varchar(30),@number2)
when @number2>=10 and @number2<100 then '0'+convert(varchar(30),@number2)
when @number2>=100 then convert(varchar(30),@number2) end as 数量 from 采购合同审批表
where substring(合同编号,3,4)=YEAR(getdate()));
end
if(@number2 <@number)//正常情况
begin
select @number3=(
select distinct case when count(*)<10 then '00'+convert(varchar(30),count(*))
when count(*)>=10 and count(*)<100 then '0'+convert(varchar(30),count(*))
when count(*)>=100 then convert(varchar(30),count(*))
end as 数量 from 采购合同审批表
where substring(合同编号,3,4)=YEAR(getdate()));
end
select @String=substring(合同编号,0,11) from inserted;
select @String2=合同编号 from inserted;
update 采购合同审批表 set 合同编号 = rtrim(ltrim(rtrim(ltrim(@String))+rtrim(ltrim(@number3)))) where 合同编号=@String2
end
下面接一下之前的那边链接,两篇可以对照看一下
https://blog.csdn.net/suntao1995/article/details/88864575