關於批量插入時觸發器的使用

2021-04-13 23:06:30 字數 2994 閱讀 4466

終於突破這個關口了。兩天半時間沒有白費。

批量插入時,主要使用

游標遍歷資料庫實現

--建立測試表  

if exists (select * from dbo.sysobjects where id = object_id(n'[dbo].[實際銷售表]') and objectproperty(id, n'isusertable') = 1)

drop table [dbo].[實際銷售表]go

create table [dbo].[實際銷售表] (

[id] [int] identity (1, 1)  primary  key not null ,

[銷售月份] [nvarchar] (30) collate chinese_prc_ci_as not null ,

[訂單號id] [varchar] (30) collate chinese_prc_ci_as null ,

[銷售單位id] [nvarchar] (30) collate chinese_prc_ci_as null ,

[銷售單位] [nvarchar] (30) collate chinese_prc_ci_as not null ,

[藥品id] [varchar] (4) collate chinese_prc_ci_as null ,

[藥品名稱] [nvarchar] (30) collate chinese_prc_ci_as null ,

[銷售數量] [int] not null

) on [primary]go

--建立觸發器  

create   trigger   tg_insert_銷售表   on   實際銷售表  

instead  of   insert  

as  

declare   @銷售單位   nvarchar(20)

declare   @藥品id   nvarchar(20)

declare   @藥品名稱   nvarchar(20)

declare   @銷售單位id   nvarchar(20)

declare   @銷售數量   int

declare   @銷售月份 varchar(10) 

declare   @訂單號id   varchar(20)  

declare   @num   int  

declare test_cursor cursor for

select 銷售月份,銷售單位,銷售單位id,藥品id,藥品名稱,銷售數量 from  inserted   

open test_cursor

fetch next from test_cursor into @銷售月份,@銷售單位,@銷售單位id,@藥品id,@藥品名稱,@銷售數量

while @@fetch_status=0

begin 

select   @訂單號id=max(訂單號id)   from   實際銷售表   where   訂單號id   like   @銷售月份  +   '%'  

if   @訂單號id   is   null  

set   @訂單號id= @銷售月份   +   '-0000001'  

else  

begin  

set   @num=cast(substring(@訂單號id,10,7)   as   int)  

set   @num=@num   +   1  

if    @num>=1000000  

set   @訂單號id=@銷售月份   +   '-'   +   cast(@num   as   varchar(7))  

else  if @num>=100000

set   @訂單號id=@銷售月份   +   '-0'   +   cast(@num   as   varchar(6)) 

else  if @num>=10000

set   @訂單號id=@銷售月份   +   '-00'   +   cast(@num   as   varchar(5))

else  if @num>=1000

set   @訂單號id=@銷售月份   +   '-000'   +   cast(@num   as   varchar(4))

else  if @num>=100

set   @訂單號id=@銷售月份   +   '-0000'   +   cast(@num   as   varchar(3)) 

else  if @num>=10

set   @訂單號id=@銷售月份   +   '-00000'   +   cast(@num   as   varchar(2))

else  if @num<10

set   @訂單號id=@銷售月份   +   '-000000'   +   cast(@num   as   varchar(1))   

endinsert  into 實際銷售表 values(@銷售月份,@訂單號id,@銷售單位id,@銷售單位,@藥品id,@藥品名稱,@銷售數量)

if @@error<>0

begin

rollback tran

close test_cursor

deallocate test_cursor

return

end

fetch next from test_cursor into @銷售月份,@銷售單位,@銷售單位id,@藥品id,@藥品名稱,@銷售數量

endclose test_cursor

deallocate test_cursor

--drop trigger   tg_insert_銷售表

--測試資料   單個資料的插入測試

insert   into   實際銷售表(銷售月份,銷售單位id,銷售單位,藥品id,藥品名稱,銷售數量)   values('20071103','','測試單位','0001','獨24','9')

--select * from 實際銷售表

解決觸發器批量插入時只有第條一資料生效問題

如果是批量插入資料則要宣告乙個表來拿到這批插入的資料。如果只是宣告乙個變數值,則只能拿到第一條資料,所以這就會導致批量資料插入時觸發器無效的原因。實際例子 建立表 create table test 1 fid int typeid varchar 36 新增乙個插入資料後觸發的觸發器 create...

imp匯入時觸發器的狀態

經過imp tables的實驗,總結如下 1.imp tables過程中insert觸發器會起作用 2.imp tables時先delete該錶相應部分 即如果delete觸發器刪除了insert時關聯的表的記錄 imp tables成功 3.imp tables時先truncate table,當...

關於觸發器

dml觸發器 語句觸發器 當執行dml語句時被隱含執行的觸發器 語法 create or replace trigger t update a event1 or event2 or event3 on table name pl sql block 行觸發器 當執行dml語句時,每作用一行被觸發一...