如果由于错误导致任何语句失败,是否有任何方法可以自动throw
存储过程?
我在一个带有merge
语句的存储过程中,由于主键违规而失败,但执行仍然继续。
我是否必须到处寻找if @@error != 0 throw ...
?
编辑:我正在使用MS SQL Server 2012
编辑:这似乎有效,但有一个不那么详细的解决方案吗?似乎try/catch
的引入会在遇到错误时使流跳转到catch
块。从那里我只是重新抛出异常。
begin try
....do lots of sql code
end try
begin catch
throw;
end catch
答案 0 :(得分:3)
在语句开头使用SET xact_abort ON
。如果任何特定语句失败,它将导致自动回滚。
请参阅What is the benefit of using "SET XACT_ABORT ON" in a stored procedure?。
编辑:以上内容适用于SQL-Server。
答案 1 :(得分:1)
如何将它包装在一个事务中,这样如果有任何失败,它将回滚任何更改,你可以让它返回一条错误消息。
像
这样的东西BEGIN Transaction
--Do some code
if @@error > 0
BEGIN
--Do your throw here and then
ROLLBACK TRANSACTION
END
ELSE
BEGIN
COMMIT TRANSACTION
END