2

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
4

2 回答 2

3

SET xact_abort ON在语句的开头使用。如果任何特定语句失败,它将导致自动回滚。

请参阅在存储过程中使用“SET XACT_ABORT ON”有什么好处?.

编辑:以上是针对 SQL-Server 的。

于 2013-08-02T21:17:08.610 回答
1

如何将其包装在事务中,以便如果出现任何故障,它将回滚任何更改,并且您可以让它返回错误消息。

就像是

BEGIN Transaction
--Do some code

if @@error > 0 
BEGIN
--Do your throw here and then
ROLLBACK TRANSACTION
END
ELSE

BEGIN
COMMIT TRANSACTION
END
于 2013-08-02T21:16:32.780 回答