带有@@Error的TSQL性能,是否可以替换
本文关键字:是否 替换 性能 @@Error TSQL 带有 | 更新日期: 2023-09-27 18:12:37
我继承了这样的代码:
存储过程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中像这样的
try
{
myCommand.ExecuteNonQuery();
}
catch (System.Exception ex)
{
_log.Error(ex);
throw();
}
finally
{
if(myConnection!=null)
{
myConnection.Close();
}
}
我只是问自己:部分如果@@Error> 0 Goto ERR有什么好处吗?如果发生错误,sp无论如何都会返回,并且在调用方法中捕获异常。
调用代码不处理返回值0和-1。我的计划是删除存储过程中的所有错误处理,得到相同的结果。我是对的,还是我错过了什么?
一个更好的方法(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
一个很好的参考是:错误处理在SQL 2005和更新
我的'2美分'您将通过删除if@error语句来降低性能。所以你要么像mitch说的那样实现try catch,要么不删除它们。只要想一想,如果第一个语句出错,那么当你有if@error语句时,它就不会尝试执行第二个语句,等等。
,如果你删除它们,SQL服务器将尝试下一个语句,直到它达到限制,当它决定它不能继续进行进一步的处理