SP ошибка отлова - PullRequest
       13

SP ошибка отлова

0 голосов
/ 17 февраля 2012

Может кто-нибудь порекомендовать улучшить следующий код процедуры магазина.

В прошлом для меня всегда было лучше иметь мою транзакцию в C # и откатываться оттуда, но теперь мне нужно иметь транзакцию ипопробуйте catch block в самом SP.

Я нашел много примеров транзакций в SP и попробуйте блокировать catch, но не многие из них вместе взятые.

Я хотел бы знать, чтобудет код ниже:

  1. Перехват всех ошибок

  2. устранит все риски сбоя или тайм-аута SP и оставит транзакцию открытой и не свернутойназад

  3. Устранить все риски совершения SP, даже если произошла ошибка.

    SET NOCOUNT ON;
    SET XACT_ABORT ON; --used so transaction is not left open in the even of an error or timeout
    
    DECLARE @Error int
    
    BEGIN TRANSACTION
        BEGIN TRY
    
            INSERT INTO Locations_Internal (Loc_Ref, Loc_Code, Loc_Desc, Company_For_Desc, Row_Updated_PDA_Sync)
    VALUES (@Loc_Ref, @Loc_Code, @Loc_Desc, @Company_For_Desc, 'invalid value');
    SELECT @Error =@@ERROR; 
    IF @@ERROR <> 0 GOTO ERR_HANDLER;           
    
    --OTHER INSERT/DELETE/UPDATE Statements
    
        END TRY
        BEGIN CATCH
            SET @Error = @@ERROR;
                GOTO ERR_HANDLER;
            END CATCH
    
    
    COMMIT TRANSACTION
    RETURN 0;       
    
    
    
    ERR_HANDLER:
       SELECT 'Unexpected error occurred!'
       ROLLBACK TRANSACTION
       RETURN @Error
    

Спасибо за ответ Manjunatha Gouli,

Будет ли это работать, если оператор вставки завершится неудачно, но не завершится с ошибкой и выдаст исключение, которое он просто выполняет с остальной частью процедуры?Это вообще возможно?

Я спрашиваю, потому что большинство примеров, которые я видел, проверяют @@ error после каждого оператора INSERT / UPDATE / DELETE / SELECT, по-прежнему ли требуется этот подход при использовании транзакций или каждая ошибка будетпойманный поймать, а не просто продолжать код.

Нужно ли мне вообще проверять @@ ERROR в SP, если я использую блоки try try?Все ли статьи, ссылающиеся на это, предназначены для более старых версий MS SQL, в которых не реализован try catch?

1 Ответ

0 голосов
/ 17 февраля 2012

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

НАЧАТЬ ИСПЫТАТЬ НАЧАТЬ СДЕЛКУ T1
ВСТАВИТЬ INTO Locations_Internal (Loc_Ref, Loc_Code, Loc_Desc, Company_For_Desc, Row_Updated_PDA_Sync @ VALU (VALU) (VALU), @Loc_Code, @Loc_Desc, @Company_For_Desc, 'неверное значение');

COMMIT TRANSACTION T1
RETURN 0;           

КОНЕЦ ИСПЫТАНИЯ НАЧАТЬ ЗАПИСЬ СДЕЛКА С РОЛЛБЕКОМ T1 ВОЗВРАТ @@ ОШИБКА;КОНЕЦ КАТЧ

...