<SQL> SQL instead of trigger 触发器

1 篇文章 0 订阅
环境
  • Azure SQL Database
  • Visual Studio 2019
  • ASP NET CORE 2.2

写Trigger, 使用cursor遍历

CREATE TRIGGER [TriggerBeforeInsertUpdate]
ON [dbo].[ChineseCharacter]
INSTEAD OF INSERT, Update
AS
BEGIN
	SET NOCOUNT ON
	declare @t table([id] bigint not null);
	declare @insertedline int = 0;
	declare @id bigint;
	declare @oldid bigint;
	declare @data nvarchar(max);
	-- declare a cursor
	-- 定义为local避免出现已经定义
	DECLARE insert_cursor CURSOR LOCAL FOR 
	SELECT	ID, Data
		from inserted;
 
	-- open cursor and fetch first row into variables
	OPEN insert_cursor
	FETCH NEXT FROM insert_cursor 
			into @id, @data,
	
	-- 开始循环遍历
	-- check for a new row
	WHILE @@FETCH_STATUS=0
	BEGIN
		-- do complex operation here 
		select @oldid = ID from deleted where ID = @id;
	
		if @oldid is null 
		begin
			-- 说明执行的是插入
			set @insertedline  += 1;
			insert into @t values (@id);
		end
		else 
		begin
			-- 说明执行的是更新 
		end

		-- get next available row into variables
		FETCH NEXT FROM insert_cursor 
			into @id, @data,

	END

	close insert_cursor
	Deallocate insert_cursor
	
	-- 返回受影响的行数
   if @insertedline > 0
   	  select * from @t;
END

问题解决:

  1. 出现错误Database operation expected to affect 1 row(s) but actually affected 0 row(s)

insert最后没有返回受影响的行数
– 返回受影响的行数
select * from @t

  1. 提示Cursor已存在

为cursor添加LOCAL描述符
DECLARE insert_cursor CURSOR LOCAL FOR

关于Deleted和Inserted表
InsertDeleteUpdate
Inserted插入列修改前的列
Deleted删除列修改后的列

所以我们可以根据Deleted表来判断是Insert还是update.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值