带有@@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。我的计划是删除存储过程中的所有错误处理,得到相同的结果。我是对的,还是我错过了什么?

带有@@Error的TSQL性能,是否可以替换

一个更好的方法(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服务器将尝试下一个语句,直到它达到限制,当它决定它不能继续进行进一步的处理