任何人都可以推荐对以下存储过程代码进行改进。SP错误捕获
在过去,对我来说最好的办法是使用C#进行事务处理,然后从那里回滚,但现在我需要在SP中拥有事务并尝试catch块。
我发现了很多SP中事务的例子,并尝试catch块,但没有多少结合起来。
我想知道的是将下面的代码:
捕获所有错误的
除去SP崩溃或超时的所有风险,并留下交易公开,没有推出返回
即使发生错误,也可以消除SP提交的所有风险。
SET NOCOUNT ON; SET XACT_ABORT ON; --used so transaction is not left open in the even of an error or timeout DECLARE @Error int BEGIN TRANSACTION BEGIN TRY INSERT INTO Locations_Internal (Loc_Ref, Loc_Code, Loc_Desc, Company_For_Desc, Row_Updated_PDA_Sync) VALUES (@Loc_Ref, @Loc_Code, @Loc_Desc, @Company_For_Desc, 'invalid value'); SELECT @Error [email protected]@ERROR; IF @@ERROR <> 0 GOTO ERR_HANDLER; --OTHER INSERT/DELETE/UPDATE Statements END TRY BEGIN CATCH SET @Error = @@ERROR; GOTO ERR_HANDLER; END CATCH COMMIT TRANSACTION RETURN 0; ERR_HANDLER: SELECT 'Unexpected error occurred!' ROLLBACK TRANSACTION RETURN @Error
感谢您的答复Manjunatha沟里,
想,如果插入语句失败,但是不会崩溃,并抛出一个异常,它只是进行与的其余部分的工作程序?这甚至有可能吗?
我问,因为我看过的大多数例子在每个INSERT/UPDATE/DELETE/SELECT语句后都检查@@错误,这种方法在使用事务时仍然是必需的,或者每个错误都会被catch捕获,而不仅仅是继续执行代码。
如果我使用try catch块,我甚至需要打扰检查SP中的@@ ERROR吗?是否所有的文章都是针对这个设计的老版本的MS SQL,没有实现try catch?