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