IF, RAISERROR & RETURN в хранимой процедуре - PullRequest
3 голосов
/ 01 июля 2011

У меня есть хранимая процедура, PROC, которая получает некоторые параметры.Если один из них, @ID, не равен NULL, необходимо выполнить заданную хранимую процедуру, PROC_A.В противном случае PROC_B должно быть выполнено.Проблема в том, что оба они могут выдавать RAISERROR, который я хочу распространить через стек вызовов, чтобы отобразить в клиентском приложении.Однако, это RAISERROR не остановит остальную часть хранимой процедуры PROC, как следует, и, поскольку я использую предложение IF, проверка IF ( @@ERROR <> 0 ) RETURN также не вариант.Кажется, мой единственный выбор - использовать блок TRY...CATCH, чтобы обернуть предложение IF и перебросить RAISERROR из блока CATCH, что неудобно, поскольку тогда мне придется кэшировать ERROR_MESSAGE(), ERROR_SEVERITY()и ERROR_STATE() и снова используйте RAISERROR.

Неужели нет более элегантного способа?

1 Ответ

8 голосов
/ 01 июля 2011

просто используйте блок TRY - CATCH и отзовите исходную ошибку, что не так сложно сделать:

BEGIN TRY
    --used in the CATCH block to echo the error back
    DECLARE @ErrorMessage nvarchar(400), @ErrorNumber int, @ErrorSeverity int, @ErrorState int, @ErrorLine int

    --Your stuff here

END TRY
BEGIN CATCH

    --your error code/logging here

    --will echo back the complete original error message
    SELECT @ErrorMessage = N'Error %d, Line %d, Message: '+ERROR_MESSAGE(),@ErrorNumber = ERROR_NUMBER(),@ErrorSeverity = ERROR_SEVERITY(),@ErrorState = ERROR_STATE(),@ErrorLine = ERROR_LINE()
    RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState, @ErrorNumber,@ErrorLine)

END CATCH

Кроме того, лучше всего, чтобы вся процедура в*, а не только внешние вызовы процедур.

...