2015-09-09 3 views
0

Я нашел код, приведенный ниже в нашей хранимой процедуры:Использование Обработка ошибок в хранимой процедуре

BEGIN TRAN 
    SET NOCOUNT ON 

    DECLARE @rerror As Int 

    if not exists(select * from OfficeSchedule 
        where OfficeID = @officeid and WeekDate = @weekdate) 
    begin 

     INSERT INTO OfficeSchedule (OfficeID, WeekDate, Status, CreatedBy, CreatedDate, RowStatus) 
     VALUES (@officeid, @weekdate, 'U', @createdby, GetDate(), 'A') 
    end 

    SET @rerror = @@error 

    IF @rerror <> 0 BEGIN 
     ROLLBACK TRAN 
    END 
    ELSE BEGIN 
     COMMIT TRAN 

     SELECT @@identity 
    END 

Какова цель переменной @error. Если вставка терпит неудачу, транзакция не откат? Если я изменил код, обработав блок else, как показано ниже:

INSERT INTO OfficeSchedule (OfficeID, WeekDate, Status, CreatedBy, CreatedDate, RowStatus) 
    VALUES (@officeid, @weekdate, 'U', @createdby, GetDate(), 'A') 
end 
Else 
begin 
    INSERT INTO OfficeSchedule (OfficeID, WeekDate, Status, CreatedBy, CreatedDate, RowStatus) 
    VALUES (@officeid, getdate(), 'U', @createdby, GetDate(), 'A') 
end 

то необходимо ли использовать обработку ошибок?

Получите ли мы какие-либо преимущества, используя error handling в хранимой процедуре?

Оцените свои предложения.

Спасибо

+0

'НАЧАТЬ TRY/END TRY CATCH НАЧАТЬ/END CATCH', транзакции в TRY блоке обработки ошибок в блоке поймать – lad2025

+0

Возвращает номер ошибки для утверждения последней Transact-SQL, выполняемой HTTP://stackoverflow.com/questions/31684475/ – wiretext

ответ

0

От Q. Какова цель переменной @@ERROR. если сбой вставки

Возвращает номер ошибки, если предыдущий оператор обнаружил ошибку. Если ошибка была одной из ошибок в представлении каталога sys.messages, то @@ERROR содержит значение из столбца sys.messages.message_id для этой ошибки. Вы можете просмотреть текст, связанный с номером ошибки @@ERROR в sys.messages.

Поскольку @@ERROR очищается и сбрасывается на каждый выполняемый оператор, проверяйте его сразу же после проверяемого утверждения или сохраняйте его в локальной переменной, которая может быть проверена позже. @@ERROR Description and Example

TRANSACTION & TRY-CATCH

+0

Вставка завершается с ошибкой, когда условие if not exists завершается с ошибкой, но я добавил блок else для обработки этого в модифицированном коде. все еще требуется @error? –

+0

@bmsqldev, если наш 'IF NOT EXISTS' не выполнен, тогда запрос будет разбиваться на одну строку, тогда он перейдет в блок' CATCH' – wiretext

+0

, так что вместо этого он будет выполнять часть else? –

0

Использование TRY..CATCH блоков:

попробовать ... CATCH конструкция состоит из двух частей: блока TRY и блока CATCH. Когда условие ошибки обнаружено в операторе Transact-SQL , который находится внутри блока TRY, управление передается блоку CATCH, где ошибка может быть обработана.

SET NOCOUNT ON; 
BEGIN TRY 
    BEGIN TRAN 

    IF NOT EXISTS (SELECT 1 
        FROM OfficeSchedule 
        WHERE [email protected] 
        AND [email protected]) 
    BEGIN 
     INSERT INTO OfficeSchedule (OfficeID, WeekDate, Status, CreatedBy, 
           CreatedDate, RowStatus) 
     VALUES (@officeid, @weekdate, 'U', @createdby, 
           GetDate(), 'A'); 
     SELECT @@identity; 
    END 

    COMMIT TRAN; 
END TRY 
BEGIN CATCH 
    ROLLBACK TRAN; 
    -- log errors 
END CATCH 

Для получения дополнительной информации об ошибке в CATCH блоке использовании:

Функция ошибок

TRY ... CATCH использует следующие функции ошибок, чтобы захватить ошибку информации:

ERROR_NUMBER() возвращает номер ошибки.

ERROR_MESSAGE() возвращает полный текст сообщения об ошибке. Текст включает значения, заданные для любых подставляемых параметров , таких как длины, имена объектов или времена.

ERROR_SEVERITY() возвращает степень серьезности ошибки.

ERROR_STATE() возвращает номер состояния ошибки.

ERROR_LINE() возвращает номер строки внутри процедуры, вызвавшей ошибку.

ERROR_PROCEDURE() возвращает имя хранимой процедуры или триггер, где произошла ошибка.