TSQL性能与@@错误并且可以替换吗?

Mat*_*s F 5 c# t-sql ado.net sql-server-2008

我继承了看起来像这样的代码:

存储过程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;
Run Code Online (Sandbox Code Playgroud)

这个sp由ADO.NET在c#中调用,就像这样

try
{
    myCommand.ExecuteNonQuery();
}
catch (System.Exception ex)
{
    _log.Error(ex);
    throw();
}
finally
{
    if(myConnection!=null)
    {
            myConnection.Close();
    }
}
Run Code Online (Sandbox Code Playgroud)

我只是问自己:部分是IF @@错误> 0转到ERR有什么好处?如果发生错误,则无论如何都会返回sp,并且会在调用方法中捕获异常.

调用代码不处理返回值0和-1.我的计划是删除存储过程中的所有错误处理,并获得相同的结果.我是对的还是我错过了什么?

Mit*_*eat 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
Run Code Online (Sandbox Code Playgroud)

一个很好的参考是:SQL 2005及更高版本中的错误处理


Sur*_*mra 1

我的“2 美分”你会通过删除 if@error 语句来降低性能。因此,要么按照米奇所说的那样实现 try catch,要么不删除它们。试想一下,如果第一个语句有错误,那么当您有 if@error 语句时,它不会尝试执行第二个语句,依此类推。

如果删除它们,sql server 将尝试下一条语句,直到达到限制,此时它决定无法继续进行进一步处理。