【SQLSERVER】触发器

文章讨论了在SQLServer中如何处理类似于Oracle的FOREACHROW概念,由于SQLServer没有这个特性,因此需要通过游标或者临时表来实现对多条数据的逻辑处理。文中提供了两种方法,一是使用游标循环遍历INSERTED表,二是利用临时表存储数据并进行遍历,以此来模拟行级触发器的行为。
摘要由CSDN通过智能技术生成

sqlserver 和 oracle 触发器还是有区别的,sqlserver 没有for each row 的概念,执行一条语句,无论多少条数据,触发一次,所以要用游标循环,做逻辑判断。当然,也可以考虑同临时表,再遍历临时表,以下是对两种方法的实现

  1. 游标
ALTER TRIGGER 触发器名字
ONAFTER INSERT, UPDATE,DELETE
AS
  BEGIN
      -- SET NOCOUNT ON added to prevent extra result sets from
      -- interfering with SELECT statements.
      SET NOCOUNT ON;
      -- Insert statements for trigger here
	  DECLARE Cursor_Inserted CURSOR LOCAL FORWARD_ONLY FOR
        SELECT [ID]
        FROM   Inserted;

      DECLARE @ID INT;
     OPEN Cursor_Inserted;
     FETCH NEXT FROM Cursor_Inserted INTO @ID;
     WHILE ( @@FETCH_STATUS = 0 ) 
      BEGIN
--subject
....
--read next
        FETCH NEXT FROM Cursor_Inserted INTO @ID;
  END
      CLOSE Cursor_Inserted;
	  DEALLOCATE Cursor_Inserted;
 END

也可以通过一下语句判断增删改的操作
if exists(select 1 from inserted) and not exists( select 1 from deleted) --insert 操作
else if exists(select 1 from inserted) and exists(select 1 from deleted) --update 操作
else if not exists(select 1 from inserted) and exists(select 1 from deleted) --delete 操作
2. 临时表

Create table #temp(ID int IDENTITY(1,1) PRIMARY KEY, PersonID int,Name varchar(50))
 
Insert into #temp(PersonID, Name) Select ID, Name From inserted   
Declare @i Int=1,@is Int=0
SELECT @is =MAX([ID]) FROM #temp
WHILE @i<@is
	 BEGIN
         ...
	 	SET @i=@i+1;
	 END
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

寒冰的暖

谢谢您的赞许投喂~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值