終於突破這個關口了。兩天半時間沒有白費。
批量插入時,主要使用
游標遍歷資料庫實現
--建立測試表
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語句時,每作用一行被觸發一...