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

时间:2011-10-27 09:34:34

标签: c# tsql sql-server-2008 ado.net

我继承了如下代码:

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

2 个答案:

答案 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将尝试下一个语句,直到它达到限制时,它决定它不能继续进行进一步处理。