触发器运用实例2

在这里插入图片描述
接上以前的触发器实例,现在面临了另一个问题,之前做的触发器是按照当前年份条数去给他设置后面对应的序号的,但是会有如图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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值