如果语句失败,SQL会自动抛出?

时间:2013-08-02 21:14:41

标签: sql

如果由于错误导致任何语句失败,是否有任何方法可以自动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

2 个答案:

答案 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