powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как перехватить Raiserror
9 сообщений из 9, страница 1 из 1
Как перехватить Raiserror
    #32015628
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть store procedure, которая вызывает другую store procedure. В результате работы вторая процедура вызывает Raiserror и срабатывет Return, как мне обработать этот Raiserror в первой процедуре?

Ситуация, я в процедуре выполняю команду INSERT, но она по каким-то причинам не выполнилась. Как перехватить эту ошибку , скажем чтоб в процедуре ее вызвавшей отработать ROLLBACK TRANSACTION ?
...
Рейтинг: 0 / 0
Как перехватить Raiserror
    #32015645
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Raiserror никак в процедуре не поймать

может проще передавать код ошибки из процедуры как параметр?
...
Рейтинг: 0 / 0
Как перехватить Raiserror
    #32015649
Проще поставить "SET XACT_ABORT ON" и не тратить время на обработку ошибок. С этой опцией, как только произойдет рантайм ошибка, задание прервется, а транзакция откатится.
...
Рейтинг: 0 / 0
Как перехватить Raiserror
    #32015652
Underking
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>SergSuper
Как это сделать? Как вообще получить код ошибки?

>Глеб Уфимцев
Можно подробней, где и когда ставится, на что распространяется, чем черевато?
...
Рейтинг: 0 / 0
Как перехватить Raiserror
    #32015654
Ставится перед BEGIN TRAN. Область действия - если ставится внутри процедуры, то настройка до конца этой процедуры и на все процедуры, вызываемые внутри этой, если снаружи, то действует до конца сессии. В любой момент можно отменить set xact_abort off, но это практически никогда не применяется. Проблем не добавляет, если при использовании понимать, что после ошибки, никакие следующие операторы в этом же батче выполнены не будут. А удобства добавляет много, так как избавляет от необходимости после каждого оператора проверять ошибку. SET XACT_ABORT ON сам сделает ROLLBACK всем открытым транзакциям. Программирование с этой хренью просто и понятно:

SET XACT_ABORT ON
BEGIN TRAN
.......... Операторы ...........
COMMIT

и больше ничего!
...
Рейтинг: 0 / 0
Как перехватить Raiserror
    #32015668
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Underking
можно же писать как Вы:
create proc a @i int
as
if @i=1 Raiserror('bla-bla',16,1)

а потом думать как это ошибку поймать. А можно написать так:

create proc a @i int, @err varchar(100)
as
if @i=1 select @err='bla-bla'


Под кодом ошибки я не имел в виду нечто системное.

Если имеются ввиду ошибки, которые вызываются сами, не через Raiserror, то тут Глеб Уфимцев уже всё написал
...
Рейтинг: 0 / 0
Как перехватить Raiserror
    #32015676
Владимир
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще то insert может невыполниться только по причине конфликта с ключами или constraint, (я молчу за переполненияя журнала транзакций..), поэтому не проще ли проверить условия перед insert и спокойно передать какой-нибудь параметр в главную процедуру, с результатом этой проверки(если вставка невозможна)..
А код ошибки можно увидеть через переменную @@error...
if @@error=0 --значит все в порядке.. Эта переменная всегда содержит результат выполнения последней операции, и изменяется после каждой транзакции..Так что в BOL все написанопо этому поводу...
...
Рейтинг: 0 / 0
Как перехватить Raiserror
    #32015684
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ставьте RETURN -1, а в вызывающей SP соотв. проверку:
EXEC @ret=Sp_Name ...
IF @ret=-1
BEGIN
ROLLBACK TRAN
RETURN
END
RAISERROR клиент и так получит.
...
Рейтинг: 0 / 0
Как перехватить Raiserror
    #32015698
Sanek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что если так попробовать :
Есть прочедура SP2 - она может дать ошибку
Текст процедуры SP1, которая ее вызывает :

----------------------
declare @X Integer
begin transaction
exec @X = SP1
if @X !=0
begin
rollback transaction
return 1
end
commit transaction
--------------------------
В этом случае ненадо менять вызываемую процедуру + это работет у меня . (и очень неплохо ..)
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как перехватить Raiserror
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]