Может кто-нибудь порекомендовать улучшить следующий код процедуры магазина.
В прошлом для меня всегда было лучше иметь мою транзакцию в C # и откатываться оттуда, но теперь мне нужно иметь транзакцию ипопробуйте catch block в самом SP.
Я нашел много примеров транзакций в SP и попробуйте блокировать catch, но не многие из них вместе взятые.
Я хотел бы знать, чтобудет код ниже:
Перехват всех ошибок
устранит все риски сбоя или тайм-аута SP и оставит транзакцию открытой и не свернутойназад
Устранить все риски совершения 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?