Stored procedures SP错误捕获
是否有人可以建议对以下存储过程代码进行改进 在过去,对我来说,最好是将事务放在C#中,然后从C#中回滚,但现在我需要将事务放在SP中并尝试catch块 我在SP和try catch块中找到了许多事务示例,但它们结合在一起的示例并不多 我想知道的是下面的代码:Stored procedures SP错误捕获,stored-procedures,transactions,try-catch,Stored Procedures,Transactions,Try Catch,是否有人可以建议对以下存储过程代码进行改进 在过去,对我来说,最好是将事务放在C#中,然后从C#中回滚,但现在我需要将事务放在SP中并尝试catch块 我在SP和try catch块中找到了许多事务示例,但它们结合在一起的示例并不多 我想知道的是下面的代码: 抓住所有错误 消除SP崩溃或超时的所有风险,使交易保持打开状态而不回滚 消除SP提交的所有风险,即使发生错误 SET NOCOUNT ON; SET XACT_ABORT ON; --used so transaction is not l
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 =@@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
设置不计数;
将XACT_ABORT设置为ON--用于使事务在发生错误或超时时不会保持打开状态
声明@Error int
开始交易
开始尝试
插入位置\内部(位置\参考、位置\代码、位置\说明、公司\说明、行\更新\ PDA \同步)
值(@Loc_Ref、@Loc_Code、@Loc_Desc、@Company_For_Desc,‘无效值’);
选择@Error=@@Error;
如果@错误0转到错误处理程序;
--其他插入/删除/更新语句
结束尝试
开始捕捉
设置@Error=@@Error;
GOTO ERR_HANDLER;
端接
提交事务
返回0;
错误处理程序:
选择“发生意外错误!”
回滚事务
返回@Error
感谢Manjunatha Gouli的回复 如果insert语句失败,但没有崩溃并抛出一个异常(它只是在过程的其余部分继续进行),那么这是否可行?这可能吗 我之所以这样问,是因为我看到的大多数示例都是在每个INSERT/UPDATE/DELETE/SELECT语句后检查@error,在使用事务时是否仍然需要这种方法,或者每个错误是否都会被捕获,而不仅仅是继续代码
如果我正在使用try-catch块,我甚至需要麻烦检查SP中的@错误吗?是否所有提及此的文章都是为没有实现try-catch的较早版本的MS SQL设计的?您可以尝试以下方法来解决您提出的所有问题 开始尝试 开始事务T1
插入位置\内部(位置\参考、位置\代码、位置\说明、公司\说明、行\更新\ PDA \同步) 值(@Loc_Ref、@Loc_Code、@Loc_Desc、@Company_For_Desc,‘无效值’) 结束尝试 开始捕捉 回滚事务T1 返回@错误; 端接
COMMIT TRANSACTION T1
RETURN 0;