sqlserver 数据库
1.下面是完整的 在存储过程中 使用游标进行 循环删除的实例(包括存储过程中,事务的应用)
2.有问题的话,欢迎随时讨饶我,相信大家看下注释应该就能明白了,很简单的一个,小例子
USE [DBTEST.Test]
GO
/****** Object: Script Date: 2020/8/6 15:37:23 ******/
/****** Object: OptionTableName 存储过程名称(自定义)******/
DROP PROCEDURE [dbo].[OptionTableName]
GO
/****** Object: Script Date: 2020/8/6 15:37:23 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[OptionTableName]
(
--输入参数
@Id int
)
as
begin
--声明记录 行数
declare @ARow int
--判断输入参数是否有效
if(@Id is not null and @Id <> '' and @Id>)
begin
--先判断表是否存在
select @ARow = count() from Table1 where Id=@Id
if(@ARow>)
begin
begin
--如果有错误发生,结束后,系统会自动回滚所有的sql操作
--xact_abort on 全部回滚操作
set xact_abort on;
begin try
begin tran
--逻辑业务 开始
--游标循环删除 关联@Id记录
begin
print('***************************操作开始***********Start****************')
print('1.记录存在')
--删除打包明细表数据
declare @Ids int
declare DelTable2_Cursor cursor --定义游标名称
for(
select c.Id from ShippingmentInfo as c left join ApplyShippingment as d on c.ApplyShippingmentId = d.Id
where d.Id= @Id
)--查出需要的集合放到游标中
open DelTable2_Cursor; --打开游标
--注意此时的读取下一行 需要和上面的for循环里面 得到的列值,一一对应
fetch next from DelTable2_Cursor into @Ids --读取第一行数据
while @@FETCH_STATUS =
begin
print('删除Id:'+CONVERT(varchar(),@Ids)) --打印数据每行的参数数据
--获取到每行的 @Ids 数据
--需要操作
delete Table2 where Id = @Ids
fetch next from DelTable2_Cursor into @Ids --读取下一行数据
end
close DelTable2_Cursor; --关闭游标
deallocate DelTable2_Cursor; --释放游标
print('游标循环表数据 删除 结束*************End**************')
end
commit tran
end try
begin catch
--在此可以使用xact_state()来判断是否有不可提交的事务,不可提交的事务
--表示在事务内部发生错误了。Xact_state()有三种值:-.事务不可提交;.事务可提交;.表示没有事务 此时commit或者rollback会报错。
if (xact_state()=-)
begin
print('***************************!!!内部出错,事务已经回滚!!!********************End**********************************');
rollback tran;
end
end catch
end
end
else begin
print(convert(nvarchar(),@Id)+',记录不存在')
print('***************************记录不存在***********End****************')
end
end
end
GO