Хранимые процедуры и обработка ошибок - PullRequest
0 голосов
/ 18 сентября 2011

У меня 10 хранимых процедур.

Например -

  • хранимая процедура извлекает строки из таблицы A

затем выполняется хранимая процедура, а затем третье ...

Как я могу сделать обработку ошибок в этом .. например, я должен проверить, если первая хранимая процедура выполнена успешно, запустить вторую ошибку throw. Если первое выполнение успешно выполнено, запустите вторую хранимую процедуру, если второе запустится успешно, запустите третье, иначе выведите ошибку.

ALTER PROCEDURE [dbo].[MASTER_PROCEDURE] AS
EXEC QRY_STEP3
EXEC QRY_STEP_3_1_1
EXEC OQRY_STEP_3_1_1

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

Я бы добавил логику к каждой из ваших вспомогательных хранимых процедур, чтобы определить, успешно они выполнены или нет. например, проверка на наличие временной таблицы. Затем используйте возвращаемое значение, чтобы указать успех процесса. Обычно это будет 0 для успеха и ненулевое значение для ошибки.

Затем вы бы назвали проки из вашего мастер-прока следующим образом

DECLARE @ReturnValue INT

EXEC @ReturnValue = QRY_STEP1

IF(@ReturnValue = 0)
BEGIN
    EXEC @ReturnValue = QRY_STEP2
END
ELSE
BEGIN
    --REPORT ERROR
END

При использовании этого подхода вашему главному процессу не нужно знать о внутренней работе каждого дочернего процесса, и ваш основной код процедуры будет чище и более читабельным.

0 голосов
/ 20 сентября 2011

Сначала, чтобы сделать это правильно, вы должны использовать блоки TRY CATCH в дочерних пакетах.Они должны вернуться к вызывающему процессу в случае ошибки.Таким образом, вы также можете вернуть код ошибки вызывающему процессу, если результаты неожиданны, например, временная таблица с нулевыми записями, которая не является ошибкой, но может привести к сбою последующих процессов.

Далее, почему вы вообще используете дочерние процессы?Честно говоря, это то, что, вероятно, лучше сделать в одном процессе.Вы говорите, например, что вы создаете временные таблицы в одном процессе, который вы используете в последующих процессах.Для этого вам нужны глобальные временные таблицы.Проблема в том, что глобальные временные таблицы не являются специфическими для первоначального соединения, которое их вызвало, и поэтому два человека, пытающиеся сделать это одновременно, могут перепутать свои данные.Принимая во внимание, что если вы используете один proc и локальные временные таблицы, этого не может быть.

0 голосов
/ 19 сентября 2011

использовать @@ error .. Можно сделать так

ALTER PROCEDURE [dbo].[MASTER_PROCEDURE] AS

EXEC QRY_STEP3 

IF @@error =0

begin

EXEC QRY_STEP_3_1_1 

else

begin

print "error in proc name"

return 1

End 

if (@@error=0) 

Begin

EXEC OQRY_STEP_3_1_1

Else

print "error in proc name"

return 1

End 

END

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