触发器实现字符串处理及统计

原创 2004年08月16日 23:56:00

原帖地址:

http://community.csdn.net/Expert/topic/3269/3269542.xml?temp=8.726138E-02

table1
序号  类别 起始号  终止号  总数  已用票号        已用票数  结余票号              结余票数 组合编号(主键)
1     A    0000001 0000005  5    0000001,0000003  2     0000002,0000004,0000005  3  
A-0000001-0000005 
2     B    0000006 00000010 5    0000006,0000008  2      0000007,0000009,0000010  3       B-0000006-0000010
table2
组合编号            类别    票号  
A-0000001-0000005   A       0000001
A-0000001-0000005   A       0000003
B-0000006-0000010   B       0000006
B-0000006-0000010   B       0000008

希能在table2写触发器更新table1已用票号,已用票数,结余票号,结余票数的字段。

--------------------------------------------------------------------------------------------------------------------


--示例

--示例数据
create table table1(序号 int,类别 varchar(10),起始号 char(7),终止号 char(7),总数 int,已用票号 varchar(8000),已用票数 int,结余票号 varchar(8000),结余票数 int,组合编号 varchar(20))
insert table1 select 1,'A','0000001','0000005',5,'',0,'0000001,0000002,0000003,0000004,0000005',5,'A-0000001-0000005'
union  all    select 2,'B','0000006','0000010',5,'',0,'0000006,0000007,0000006,0000009,0000010',5,'B-0000006-0000010'

create table table2(组合编号 varchar(20),类别 varchar(10),票号 char(7))
go

--处理的触发器
create trigger tr_process on table2
for insert,update,delete
as
declare @组合编号 varchar(20)
 ,@sta varchar(8000),@nma int
 ,@stb varchar(8000),@nmb int

--处理被删除的
select d.组合编号,d.票号
 ,已用票号=','+a.已用票号+',',a.已用票数
 ,结余票号=a.结余票号,a.结余票数
into #d
from deleted d,table1 a
where d.组合编号=a.组合编号
order by d.组合编号,d.票号

if @@rowcount>0
begin
 update #d set
  @sta=replace(
   case 组合编号 when @组合编号 then @sta else 已用票号 end,
   ','+票号+',',','),
  @nma=case 组合编号 when @组合编号 then @nma-1 else 已用票数-1 end,
  @stb=case 组合编号 when @组合编号 then @stb+','
   else case 结余票号 when '' then '' else 结余票号+',' end end+票号,
  @nmb=case 组合编号 when @组合编号 then @nmb+1 else 结余票数+1 end,
  @组合编号=组合编号,
  已用票号=@sta,已用票数=@nma,
  结余票号=@stb,结余票数=@nmb

 update a set 已用票号=case b.已用票数 when 0 then ''
   else substring(b.已用票号,2,len(b.已用票号)-2) end
  ,已用票数=b.已用票数
  ,结余票号=b.结余票号
  ,结余票数=b.结余票数
 from table1 a,#d b,(
  select 组合编号,已用票数=min(已用票数)
  from #d
  group by 组合编号
 )c where a.组合编号=b.组合编号
  and c.组合编号=b.组合编号
  and c.已用票数=b.已用票数
end

--处理新增的
select i.组合编号,i.票号
 ,已用票号=a.已用票号,a.已用票数
 ,结余票号=','+a.结余票号+',',a.结余票数
into #i
from inserted i,table1 a
where i.组合编号=a.组合编号
order by i.组合编号,i.票号

if @@rowcount>0
begin
 set @组合编号=null
 update #i set
  @sta=case 组合编号 when @组合编号 then @sta+','
   else case 已用票号 when '' then '' else 已用票号+',' end end+票号,
  @nma=case 组合编号 when @组合编号 then @nma+1 else 已用票数+1 end,
  @stb=replace(
   case 组合编号 when @组合编号 then @stb else 结余票号 end,
   ','+票号+',',','),
  @nmb=case 组合编号 when @组合编号 then @nmb-1 else 结余票数-1 end,
  @组合编号=组合编号,
  已用票号=@sta,已用票数=@nma,
  结余票号=@stb,结余票数=@nmb

 update a set 已用票号=b.已用票号
  ,已用票数=b.已用票数
  ,结余票号=case b.结余票数 when 0 then ''
   else substring(b.结余票号,2,len(b.结余票号)-2) end
  ,结余票数=b.结余票数
 from table1 a,#i b,(
  select 组合编号,已用票数=max(已用票数)
  from #i
  group by 组合编号
 )c where a.组合编号=b.组合编号
  and c.组合编号=b.组合编号
  and c.已用票数=b.已用票数
end
go

--插入数据测试
insert table2 select 'A-0000001-0000005','A','0000001'
union  all    select 'A-0000001-0000005','A','0000003'
union  all    select 'B-0000006-0000010','B','0000006'
union  all    select 'B-0000006-0000010','B','0000008'

--删除测试
delete from table2 where 票号='0000008'

--更新测试
update table2 set 票号='0000008' where 票号='0000006'
go

--显示处理结果
select * from table1
go

--删除测试
drop table table1,table2

/*--测试结果(自己看)--*/

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Zabbix 值匹配字符串 创建触发器

Zabbix监控脚本返回值是字符串时,也可以使用字符串函数来创建触发器。举个栗子,现在有个需求要监控从服务器上下载数据是否出现异常,当数据下载失败时返回异常并告警。那么就可以在监控脚本中设置当下载成功...

Oracle中通过:触发器,存储过程,Function调用实现解析Clob字段类型中存储的xml字符串

摘要:最近项目中用到了存储过程,触发器,Function,由于以前没怎么用过,所以...

Oracle 触发器中,如果取一个包含空格VARCHAR2类型的字符串,空格后的内容取不到

Oracle 触发器中,如果取一个包含空格VARCHAR2类型的字符串,空格后的内容取不到!需要用REPLACE(str,' ','')替换掉空格! 今天在写触发器判断一个Varchar2型...

汇编实现字符串分类统计

  • 2016年11月12日 09:37
  • 3KB
  • 下载

字符串处理算法(五)多线程实现代码行数统计。[风林火山]

对代码行数统计,用多线程实现,分别是物理总行数,空格行数、代码行数、注释行数。...

jQuery 实现字符串加密处理

  • 2016年04月18日 17:53
  • 5KB
  • 下载

java实现字符串处理组件-源代码

  • 2008年12月10日 17:38
  • 42KB
  • 下载

Mysql查询优化之 触发器加中间表 方法优化count()统计大数据量总数问题 转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6138288.ht

Mysql查询优化之 触发器加中间表 方法优化count()统计大数据量总数问题     转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/61382...

数电实验jk触发器实现74ls194

  • 2017年12月07日 17:12
  • 88KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:触发器实现字符串处理及统计
举报原因:
原因补充:

(最多只允许输入30个字)