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
asdeclare @組合編號 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.已用票數
endgo
--插入資料測試
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
/*--測試結果(自己看)--*/
觸發器實現字串處理及統計
序號 類別 起始號 終止號 總數 已用票號 已用票數 結餘票號 結餘票數 組合編號 主鍵 1 a 0000001 0000005 5 0000001,0000003 2 0000002,0000004,0000005 3 a 0000001 0000005 2 b 0000006 00000010 ...
觸發器實現字串處理及統計
序號 類別 起始號 終止號 總數 已用票號 已用票數 結餘票號 結餘票數 組合編號 主鍵 1 a 0000001 0000005 5 0000001,0000003 2 0000002,0000004,0000005 3 a 0000001 0000005 2 b 0000006 00000010 ...
觸發器實現字串處理及統計
序號 類別 起始號 終止號 總數 已用票號 已用票數 結餘票號 結餘票數 組合編號 主鍵 1 a 0000001 0000005 5 0000001,0000003 2 0000002,0000004,0000005 3 a 0000001 0000005 2 b 0000006 00000010 ...