Производительность TSQL с ошибкой @@ и можно ли их заменить? - PullRequest
5 голосов
/ 27 октября 2011

Я унаследовал код, который выглядит следующим образом:

Хранимая процедура 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 @@ Error> 0 Goto ERR для чего-нибудь?Если произойдет ошибка, sp все равно вернется, и в вызывающем методе будет обнаружено исключение.

Код вызова не обрабатывает возвращаемые значения 0 и -1.Мой план состоял бы в том, чтобы удалить все Обработки ошибок в Хранимой Процедуре и иметь тот же результат.Я прав или я что-то пропустил?

Ответы [ 2 ]

7 голосов
/ 27 октября 2011

Лучшим подходом (начиная с 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 и более поздних версиях

1 голос
/ 27 октября 2011

Мои '2 цента' вы убьете производительность, удалив if @ error операторов.так что либо вы реализуете try catch, как говорит mitch, либо не удаляете их.Подумайте, если в первом операторе есть ошибка, он не будет пытаться выполнить 2-й оператор и т. Д., Если у вас есть операторы if @ error.

, и если вы удалите их, сервер SQL попытается выполнить следующий оператор доон достигает предела, когда решает, что не может продолжить дальнейшую обработку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...