1. 程式人生 > 實用技巧 >sql server 儲存過程的(包含事務)方法裡面,採用遊標迴圈,批量刪除(修改)資料

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