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

 

Tags: