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: