sql server 存储过程的(包含事务)方法里面,采用游标循环,批量删除(修改)数据
sqlserver 数据库
1.下面是完整的 在存储过程中 使用游标进行 循环删除的实例(包括存储过程中,事务的应用)
2.有问题的话,欢迎随时讨饶我,相信大家看下注释应该就能明白了,很简单的一个,小例子
1 USE [DBTEST.Test] 2 GO 3 4 /****** Object: Script Date: 2020/8/6 15:37:23 ******/ 5 /****** Object: OptionTableName 存储过程名称(自定义)******/ 6 7 DROP PROCEDURE [dbo].[OptionTableName] 8 GO 9 10 /****** Object: Script Date: 2020/8/6 15:37:23 ******/ 11 SET ANSI_NULLS ON 12 GO 13 14 SET QUOTED_IDENTIFIER ON 15 GO 16 17 18 CREATE PROCEDURE [dbo].[OptionTableName] 19 ( 20 --输入参数 21 @Id int 22 ) 23 as 24 begin 25 --声明记录 行数 26 declare @ARow int 27 --判断输入参数是否有效 28 if(@Id is not null and @Id <> '' and @Id>0) 29 begin 30 --先判断表是否存在 31 select @ARow = count(1) from Table1 where Id=@Id 32 if(@ARow>0) 33 begin 34 begin 35 --如果有错误发生,结束后,系统会自动回滚所有的sql操作 36 --xact_abort on 全部回滚操作 37 set xact_abort on; 38 begin try 39 begin tran 40 --逻辑业务 开始 41 --游标循环删除 关联@Id记录 42 begin 43 print('***************************操作开始***********Start****************') 44 print('1.记录存在') 45 46 --删除打包明细表数据 47 declare @Ids int 48 declare DelTable2_Cursor cursor --定义游标名称 49 for( 50 select c.Id from ShippingmentInfo as c left join ApplyShippingment as d on c.ApplyShippingmentId = d.Id 51 where d.Id= @Id 52 )--查出需要的集合放到游标中 53 open DelTable2_Cursor; --打开游标 54 --注意此时的读取下一行 需要和上面的for循环里面 得到的列值,一一对应 55 fetch next from DelTable2_Cursor into @Ids --读取第一行数据 56 while @@FETCH_STATUS = 0 57 begin 58 print('删除Id:'+CONVERT(varchar(500),@Ids)) --打印数据每行的参数数据 59 --获取到每行的 @Ids 数据 60 --需要操作 61 delete Table2 where Id = @Ids 62 fetch next from DelTable2_Cursor into @Ids --读取下一行数据 63 end 64 close DelTable2_Cursor; --关闭游标 65 deallocate DelTable2_Cursor; --释放游标 66 print('游标循环表数据 删除 结束*************End**************') 67 end 68 commit tran 69 end try 70 begin catch 71 --在此可以使用xact_state()来判断是否有不可提交的事务,不可提交的事务 72 --表示在事务内部发生错误了。Xact_state()有三种值:-1.事务不可提交;1.事务可提交;0.表示没有事务 此时commit或者rollback会报错。 73 if (xact_state()=-1) 74 begin 75 print('***************************!!!内部出错,事务已经回滚!!!********************End**********************************'); 76 rollback tran; 77 end 78 end catch 79 end 80 end 81 else begin 82 print(convert(nvarchar(500),@Id)+',记录不存在') 83 print('***************************记录不存在***********End****************') 84 end 85 end 86 end 87 GO