SQL Server 觸發器批量資料行處理

2022-03-05 03:13:45 字數 2493 閱讀 9513

sql server的觸發器在資料批量處理時,只會觸發一次觸發器,後面的操作觸發器全部失效,sql server執行語句並不是按行語句進行,所以在批量處理資料時,觸發器需要特殊處理。

處理方式1:

在觸發器內新建一張臨時表,將所有資料暫存在臨時表(建議加上乙個自增主鍵)中,迴圈臨時表來觸發觸發器。

下面是乙個demo,批量插入資料,判斷age是否大於150,若大於資料回滾。

use [blogdemo]

go/****** object: trigger [dbo].[trigger_insert] script date: 2019/5/29 10:52:10 ******/

set ansi_nulls on

goset quoted_identifier on

goalter trigger [dbo].[trigger_insert]

on [dbo].[person]

after insert

as begin

set nocount on;

--新建一張臨時表,並加入乙個自增主鍵id,便於後面的迴圈操作

create table #temp(id int identity(1,1) primary key, personid int,name varchar(50),age int, adddate datetime)

insert into #temp(personid, name, age, adddate)

select id, name, age, adddate from inserted

declare @i int=1,@is int=0

select @is =max([id]) from #temp

while @i

begin

declare @age int =0;

select @age=age from #temp where id=@i

if(@age<150)

begin

insert into personlog(personid, name, age, adddate)

select id, name, age, adddate from #temp where id=@i

endelse

begin

print('年齡應小於150')

rollback transaction

endset @i=@i+1;

endend

處理方式2:在觸發器內使用游標來迴圈資料觸發觸發器。同樣的demo如下:

use [blogdemo]

go/****** object: trigger [dbo].[trigger_insert] script date: 2019/5/29 10:52:10 ******/

set ansi_nulls on

goset quoted_identifier on

goalter trigger [dbo].[trigger_insert]

on [dbo].[person]

after insert

as begin

set nocount on;

--游標也可以實現行機觸發器

declare insert_cursor cursor forward_only static

for select id,name,age,adddate from inserted

open insert_cursor

declare @id int, @name varchar(50), @age int,@adddate datetime

fetch from insert_cursor into @id, @name, @age, @adddate

while @@fetch_status=0

begin

if(@age>150)

begin

print('年齡應小於150')

rollback transaction

endelse

insert into personlog(personid,name,age,adddate)

values

(@id, @name, @age, @adddate)

fetch next from insert_cursor into @id, @name, @age, @adddate

endclose insert_cursor

deallocate insert_cursor

end

demo測試資料圖:

sqlserver觸發器複習

create table a a1 int,a2 int create table b b1 int,b2 int insert into a values 1,0 insert into b values 1,0 create trigger tri update a2 a on a for up...

SQL server 之 觸發器

今天對觸發器研究了一下,之前的學習感覺挺朦朧的,今天鼓搗了一天,算是有了一點點了解,把學習的體會記錄了下來。常見的觸發器 觸發器的作用 自動化操作,減少了手動操作以及出錯的機率 現實工作中用的比較少,因為想讓他執行起來效率高很難 一 dml觸發器 insert delete update 不支援se...

SQLSERVER的觸發器

觸發器的定義 觸發器是一種特殊型別的儲存過程,他不同於前面介紹過的一般的儲存過程 在sql內部把觸發器看做是儲存過程但是不能傳遞引數 一般的儲存過程通過儲存過程名稱被直接呼叫,而觸發器主要是通過事件進行觸發而被執行.總的來說,觸發器是一種功能強大的工具,在表中資料發生變化時自動強制執行,觸發器還可以...