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