觸發器維護已經用編號 未用編號

2021-05-21 19:20:28 字數 3704 閱讀 2328

table1為初始化資料,table2為已用票據

在table2上寫觸發器,table2每insert,update,or 批量delete時,實時體現tabel1的'已用票號','已用票數', '結餘票號','結餘票數'的值.

--示例

--示例資料

create table table1(序號 int,類別 varchar(10),起始號 char(7),終止號 char(7),總數 int,已用票號 varchar(8000),已用票數 int,結餘票數 int,結餘票號 varchar(8000),組合編號 varchar(20))

insert table1 select 1,'a','0000001','0000010',10,null,0,10,'0000001-0000010','a-0000001-0000010'

union  all    select 2,'b','0000011','0000020',10,null,0,10,'0000011-0000020','b-0000011-0000020'

create table table2(組合編號 varchar(20),類別 varchar(10),票號 char(7))

go--觸發器

create trigger tr_process on table2

for insert,update,delete

asselect id=identity(int,1,1)

,a.組合編號,a.票號

,b.起始號,b.終止號

,已用票號=cast(null as [varchar] (8000))

,結餘票號=cast(null as [varchar] (8000))

into #t

from table2 a,table1 b

where a.組合編號=b.組合編號

and (exists(select 1 from inserted where 組合編號=a.組合編號)

or exists(select 1 from deleted where 組合編號=a.組合編號))

order by a.組合編號,a.票號

declare @組合編號 varchar(20),@票號 int

,@已用票號 varchar(8000),@結餘票號 varchar(8000)

update #t set

@已用票號=case

when 組合編號=@組合編號

then case

when 票號=@票號+1

then case

when right(@已用票號,1)='-'

then @已用票號+票號

else left(@已用票號,len(@已用票號)-7)+票號

endelse case

when right(@已用票號,1)='-'

then left(@已用票號,len(@已用票號)-1)

else @已用票號 end+','+票號+'-'

endelse 票號+'-'

end,

@結餘票號=case

when 組合編號=@組合編號

then case

when 票號=@票號+1

then left(@結餘票號,len(@結餘票號)-8)

when right(9999999+票號,7)+'-'=right(@結餘票號,8)

then left(@結餘票號,len(@結餘票號)-1)+','

else @結餘票號+right(9999999+票號,7)+','

end+right(10000001+票號,7)+'-'

else case

when 起始號=票號

then ''

when cast(起始號 as int)+1=票號

then 起始號+','

else 起始號+'-'+right(9999999+票號,7)+','

end+right(10000001+票號,7)+'-'

end,

已用票號=@已用票號,

結餘票號=@結餘票號,

@票號=票號,

@組合編號=組合編號

update a set

已用票號=case

when right(b.已用票號,1)='-'

then left(b.已用票號,len(b.已用票號)-1)

else b.已用票號

end,

結餘票號=case

when b.終止號=b.票號+1

then left(b.結餘票號,len(b.結餘票號)-1)

when len(b.結餘票號)=8 and b.終止號--處理在子表中被全部刪除的資料

if exists(select 1 from deleted a where not exists(select 1 from table2 where 組合編號=a.組合編號))

update a set 已用票號='',已用票數=0,結餘票數=a.總數,結餘票號=a.起始號+'-'+a.終止號

from table1 a,(

select distinct 組合編號 from deleted a

where not exists(select 1 from table2 where 組合編號=a.組合編號)

)b where a.組合編號=b.組合編號

go--插入第1條記錄

insert table2 select 'a-0000001-0000010','a','0000001'

--顯示結果

select 序號,已用票號,已用票數,結餘票數,結餘票號,組合編號 from table1

go--插入第2條記錄

insert table2 select 'a-0000001-0000010','a','0000002'

--顯示結果

select 序號,已用票號,已用票數,結餘票數,結餘票號,組合編號 from table1

go--插入第3條記錄

insert table2 select 'a-0000001-0000010','a','0000004'

--顯示結果

select 序號,已用票號,已用票數,結餘票數,結餘票號,組合編號 from table1

go--插入第4條記錄

insert table2 select 'a-0000001-0000010','a','0000003'

--顯示結果

select 序號,已用票號,已用票數,結餘票數,結餘票號,組合編號 from table1

go--修改記錄

update table2 set 組合編號='b-0000011-0000020',票號='0000011'

where 組合編號='a-0000001-0000010' and 票號='0000002'

--顯示結果

select 序號,已用票號,已用票數,結餘票數,結餘票號,組合編號 from table1

go--批量刪除:

delete from table2

where 票號 in ('0000001','0000002','0000011')

--顯示結果

select 序號,已用票號,已用票數,結餘票數,結餘票號,組合編號 from table1

go--刪除測試

drop table table1,table2

/*--結果自己看--*/

利用觸發器生成編號

原貼 http munity.csdn.expert topic 4294 4294910.xml?temp 3575403 有一表 id,product id,product name 其中id是自動編號,當向這錶新增資料時候,product id自動新增資料,格式是 wpbh max id 1,...

觸發器 trigger 日期 流水 編號

create table tb colid int identity,status int,id nvarchar 14 gocreate trigger test on tb for insert,update asbegin if update status begin declare stat...

觸發器學習(實現自動編號)

前段時間需要用觸發器做個實現資料插入表時自動編號的功能,於是再學習下觸發器,硬體備份共享於此,以供討論,以免遺忘。總結常用基本點如下 1 觸發器有兩種型別 資料定義語言觸發器 ddl觸發器 和資料操縱語言觸發器 dml觸發器 ddl觸發器 在使用者對資料庫執行資料定義 create alter dr...