Поток исключений в хранимой процедуре, вызывающий другую хранимую процедуру - PullRequest
2 голосов
/ 22 июля 2011

У меня есть хранимая процедура, которая вызывает другую хранимую процедуру. В пакете обновления 2 есть попытка / транзакция / отлов / откат / raiserror. Если SP2 вызывает ошибку, будет ли он пузыриться через SP1 для вызывающего абонента, или я должен также вкладывать вызов SP2 в try / catch? Если последнее имеет место, как я могу убедиться, что я не убиваю «трассировку стека» ошибки из SP2 при поднятии / выходе из SP1?

- будет ли этот пузырь сообщать об ошибке SP2 и также выходить из SP1?

EXEC dbo.storedProc2 @someParameter = @someValue 

- Или мне нужно это сделать?

BEGIN TRY
    EXEC dbo.storedProc2 @someParameter = @someValue
END TRY
BEGIN CATCH
    -- this is what I normally do in a simple catch/raise scenario:
    -- will it kill the error stack?
    DECLARE @ErrMsg VARCHAR(4000), @ErrSeverity INT, @ErrState INT, @ErrLine INT
    SELECT @ErrMsg = ERROR_MESSAGE() + '  Line %d', 
           @ErrSeverity = ERROR_SEVERITY(), 
           @ErrState = ERROR_STATE(),
           @ErrLine = ERROR_LINE()
    RAISERROR(@ErrMsg, @ErrSeverity, @ErrState, @ErrLine)
END CATCH

Ответы [ 2 ]

3 голосов
/ 22 июля 2011

Вам понадобится внешний блок TRY/CATCH.

Если у вас есть только перехват ошибок в SP2, то при ошибках SP2 он будет прерван.
Затем он передаст код ошибки обратно в SP1, но SP1 продолжит выполняться в большинстве случаев (исключение будет фатальной ошибкой с серьезностью 20-25).

Нет реального отслеживания ошибок, присущих без использования TRY/CATCH (или проверки @@Error, если вы старомодны) - код продолжит выполняться, к лучшему или к худшему.

0 голосов
/ 22 июля 2011

Вы должны отлавливать ошибки и устранять их в dbo.storedProc2

Затем верните коды ошибок, используя метод return n

SP1 может затем обработать эту ошибку (ошибки) любым необходимым способом.

...