新手 写了一段 要实现两个表同时操作的 存储过程 求解

时间:2022-01-19 21:56:15
--该存储过程需求: 当给 teacher 表添加数据时,要删除id字段对应的 student 表数据.
--1:事物内设置保存点
--2:使用Try  catch 捕获错误
create procedure liangchen
@id varchar(10),
@name varchar(8),
@age int,
@school varchar(50)  
as 

begin 

-- set nocount on --将该参数设置为On,表示不返回计数,
--将该参数设置为Off,表示返回计数,
--语句块结尾加入set nocount off 可以存储过程

begin tran ok --开始一个事物为 ok

--begin try --开始try

-- save   tran  bcd   --保存一个事务点命名为bcd 

insert into teacher_1 values(@id , @name , @age , @school) 

if @@error <> 0 --判断上一条语句有没有出错

begin --如果出错

rollback tran ok --回滚到ok

commit tran ok --提交事物

end 

else --如果没有出错

delete from student_1 where id=@id --执行第二条语句

if @@error <> 0 --判断删除数据有没有出错

begin --如果出错

rollback tran ok --回滚到ok

commit tran ok --提交事物

end

else  --如果没有出错
 
 commit  tran ok --提交事务  
 
End





9 个解决方案

#1


我有两张表   当要给Teacher表 填一行数据时,就要把ID字段对应的student表删除一行,  第一次 写 这个存储过程,谢谢大家帮助。
   
   上述代码的大概意思是:使用两个if @@error <> 0  来嵌套判断 插入和删除的两个语句;  我不知道我这样可以不;也不知道if @@error <> 0这样用对不对,语法对不对也不知道。

#2


代码中的  开始Try   被我注释了.     别在意这个。    这个应该怎么写才对呢。
 新人   谢谢大家帮助

#3


这里为会要用保存点?
最好是一个事务一块就搞定
begin tran
-- 这里是你的处理代码
-- 增加teacher表
-- 删除对应id的其它表
commit tran

#4


引用 3 楼 jinfengyiye 的回复:
这里为会要用保存点?
最好是一个事务一块就搞定
begin tran
-- 这里是你的处理代码
-- 增加teacher表
-- 删除对应id的其它表
commit tran
谢谢回复   可是我的想法是  如果第一个插入语句不成功或者错误  那么第二条删除语句就不可以执行并且要回滚,如果第一条语句成功了,但第二条语句没有成功,那么整体也要回滚 ;  这样的话 存储过程应该怎么弄  

#5


大神们 在不在  有木有知道的  谢谢啊啊啊啊

#6


顶顶顶顶顶顶

#7


引用 4 楼 sinat_38025047 的回复:
Quote: 引用 3 楼 jinfengyiye 的回复:

这里为会要用保存点?
最好是一个事务一块就搞定
begin tran
-- 这里是你的处理代码
-- 增加teacher表
-- 删除对应id的其它表
commit tran
谢谢回复   可是我的想法是  如果第一个插入语句不成功或者错误  那么第二条删除语句就不可以执行并且要回滚,如果第一条语句成功了,但第二条语句没有成功,那么整体也要回滚 ;  这样的话 存储过程应该怎么弄  

事务就是这样的啊。 第一条失败 就回滚了。第二条失败也会回滚。

#8


引用 7 楼 jinfengyiye 的回复:
Quote: 引用 4 楼 sinat_38025047 的回复:

Quote: 引用 3 楼 jinfengyiye 的回复:

这里为会要用保存点?
最好是一个事务一块就搞定
begin tran
-- 这里是你的处理代码
-- 增加teacher表
-- 删除对应id的其它表
commit tran
谢谢回复   可是我的想法是  如果第一个插入语句不成功或者错误  那么第二条删除语句就不可以执行并且要回滚,如果第一条语句成功了,但第二条语句没有成功,那么整体也要回滚 ;  这样的话 存储过程应该怎么弄  

事务就是这样的啊。 第一条失败 就回滚了。第二条失败也会回滚。
那我回滚的语句应该写在那块?

#9


可以不用写,开启xact那个标志。
也可以用try catch 同上层代码一样。有异常则rollback就可以了。

#1


我有两张表   当要给Teacher表 填一行数据时,就要把ID字段对应的student表删除一行,  第一次 写 这个存储过程,谢谢大家帮助。
   
   上述代码的大概意思是:使用两个if @@error <> 0  来嵌套判断 插入和删除的两个语句;  我不知道我这样可以不;也不知道if @@error <> 0这样用对不对,语法对不对也不知道。

#2


代码中的  开始Try   被我注释了.     别在意这个。    这个应该怎么写才对呢。
 新人   谢谢大家帮助

#3


这里为会要用保存点?
最好是一个事务一块就搞定
begin tran
-- 这里是你的处理代码
-- 增加teacher表
-- 删除对应id的其它表
commit tran

#4


引用 3 楼 jinfengyiye 的回复:
这里为会要用保存点?
最好是一个事务一块就搞定
begin tran
-- 这里是你的处理代码
-- 增加teacher表
-- 删除对应id的其它表
commit tran
谢谢回复   可是我的想法是  如果第一个插入语句不成功或者错误  那么第二条删除语句就不可以执行并且要回滚,如果第一条语句成功了,但第二条语句没有成功,那么整体也要回滚 ;  这样的话 存储过程应该怎么弄  

#5


大神们 在不在  有木有知道的  谢谢啊啊啊啊

#6


顶顶顶顶顶顶

#7


引用 4 楼 sinat_38025047 的回复:
Quote: 引用 3 楼 jinfengyiye 的回复:

这里为会要用保存点?
最好是一个事务一块就搞定
begin tran
-- 这里是你的处理代码
-- 增加teacher表
-- 删除对应id的其它表
commit tran
谢谢回复   可是我的想法是  如果第一个插入语句不成功或者错误  那么第二条删除语句就不可以执行并且要回滚,如果第一条语句成功了,但第二条语句没有成功,那么整体也要回滚 ;  这样的话 存储过程应该怎么弄  

事务就是这样的啊。 第一条失败 就回滚了。第二条失败也会回滚。

#8


引用 7 楼 jinfengyiye 的回复:
Quote: 引用 4 楼 sinat_38025047 的回复:

Quote: 引用 3 楼 jinfengyiye 的回复:

这里为会要用保存点?
最好是一个事务一块就搞定
begin tran
-- 这里是你的处理代码
-- 增加teacher表
-- 删除对应id的其它表
commit tran
谢谢回复   可是我的想法是  如果第一个插入语句不成功或者错误  那么第二条删除语句就不可以执行并且要回滚,如果第一条语句成功了,但第二条语句没有成功,那么整体也要回滚 ;  这样的话 存储过程应该怎么弄  

事务就是这样的啊。 第一条失败 就回滚了。第二条失败也会回滚。
那我回滚的语句应该写在那块?

#9


可以不用写,开启xact那个标志。
也可以用try catch 同上层代码一样。有异常则rollback就可以了。