我继承了如下代码:
存储过程UpdateSomeStuff
Update Table1 Set Col1=Para@1
IF @@Error > 0 Goto ERR
Update Table2 Set Col1=Para@2
IF @@Error > 0 Goto ERR
RETURN 0
ERR:
return -1;
此sp由ADO.NET在c#中调用,如此
try
{
myCommand.ExecuteNonQuery();
}
catch (System.Exception ex)
{
_log.Error(ex);
throw();
}
finally
{
if(myConnection!=null)
{
myConnection.Close();
}
}
我只是问自己:部分是 IF @@错误> 0转到ERR 有什么好处?如果发生错误,sp将会返回,并且将在调用方法中捕获异常。
调用代码不处理返回值0和-1。我的计划是删除存储过程中的所有错误处理,并获得相同的结果。我是对的还是我错过了什么?
答案 0 :(得分:7)
更好的方法(SQL Server 2005以上)是使用TRY..CATCH
:
BEGIN TRY
-- Perform operations here
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber, ERROR_MESSAGE() AS ErrorMessage;
END CATCH
一个很好的参考是:Error Handling in SQL 2005 and Later
答案 1 :(得分:1)
我的'2美分'你将通过删除if @ error语句来杀死性能。 所以你要么实现try catch作为mitch说,要么不删除它们。 试想一下,如果第一个语句出错,那么当你有if语句时,它就不会尝试执行第二个语句等等。
如果你删除它们,sql server将尝试下一个语句,直到它达到限制时,它决定它不能继续进行进一步处理。