觸發器實現字串處理及統計

2021-04-14 11:40:04 字數 4028 閱讀 9897

序號  類別 起始號  終止號  總數  已用票號        已用票數  結餘票號              結餘票數 組合編號(主鍵)

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 ...

觸發器實現字串處理及統計

table1 序號 類別 起始號 終止號 總數 已用票號 已用票數 結餘票號 結餘票數 組合編號 主鍵 1 a 0000001 0000005 5 0000001,0000003 2 0000002,0000004,0000005 3 a 0000001 0000005 2 b 0000006 00...