Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как перехватить Raiserror
|
|||
|---|---|---|---|
|
#18+
Есть store procedure, которая вызывает другую store procedure. В результате работы вторая процедура вызывает Raiserror и срабатывет Return, как мне обработать этот Raiserror в первой процедуре? Ситуация, я в процедуре выполняю команду INSERT, но она по каким-то причинам не выполнилась. Как перехватить эту ошибку , скажем чтоб в процедуре ее вызвавшей отработать ROLLBACK TRANSACTION ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2001, 07:57 |
|
||
|
Как перехватить Raiserror
|
|||
|---|---|---|---|
|
#18+
Raiserror никак в процедуре не поймать может проще передавать код ошибки из процедуры как параметр? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2001, 09:36 |
|
||
|
Как перехватить Raiserror
|
|||
|---|---|---|---|
|
#18+
Проще поставить "SET XACT_ABORT ON" и не тратить время на обработку ошибок. С этой опцией, как только произойдет рантайм ошибка, задание прервется, а транзакция откатится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2001, 09:59 |
|
||
|
Как перехватить Raiserror
|
|||
|---|---|---|---|
|
#18+
>SergSuper Как это сделать? Как вообще получить код ошибки? >Глеб Уфимцев Можно подробней, где и когда ставится, на что распространяется, чем черевато? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2001, 10:11 |
|
||
|
Как перехватить Raiserror
|
|||
|---|---|---|---|
|
#18+
Ставится перед BEGIN TRAN. Область действия - если ставится внутри процедуры, то настройка до конца этой процедуры и на все процедуры, вызываемые внутри этой, если снаружи, то действует до конца сессии. В любой момент можно отменить set xact_abort off, но это практически никогда не применяется. Проблем не добавляет, если при использовании понимать, что после ошибки, никакие следующие операторы в этом же батче выполнены не будут. А удобства добавляет много, так как избавляет от необходимости после каждого оператора проверять ошибку. SET XACT_ABORT ON сам сделает ROLLBACK всем открытым транзакциям. Программирование с этой хренью просто и понятно: SET XACT_ABORT ON BEGIN TRAN .......... Операторы ........... COMMIT и больше ничего! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2001, 10:30 |
|
||
|
Как перехватить Raiserror
|
|||
|---|---|---|---|
|
#18+
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, то тут Глеб Уфимцев уже всё написал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2001, 13:04 |
|
||
|
Как перехватить Raiserror
|
|||
|---|---|---|---|
|
#18+
Вообще то insert может невыполниться только по причине конфликта с ключами или constraint, (я молчу за переполненияя журнала транзакций..), поэтому не проще ли проверить условия перед insert и спокойно передать какой-нибудь параметр в главную процедуру, с результатом этой проверки(если вставка невозможна).. А код ошибки можно увидеть через переменную @@error... if @@error=0 --значит все в порядке.. Эта переменная всегда содержит результат выполнения последней операции, и изменяется после каждой транзакции..Так что в BOL все написанопо этому поводу... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2001, 15:17 |
|
||
|
Как перехватить Raiserror
|
|||
|---|---|---|---|
|
#18+
Ставьте RETURN -1, а в вызывающей SP соотв. проверку: EXEC @ret=Sp_Name ... IF @ret=-1 BEGIN ROLLBACK TRAN RETURN END RAISERROR клиент и так получит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.10.2001, 17:04 |
|
||
|
Как перехватить Raiserror
|
|||
|---|---|---|---|
|
#18+
А что если так попробовать : Есть прочедура SP2 - она может дать ошибку Текст процедуры SP1, которая ее вызывает : ---------------------- declare @X Integer begin transaction exec @X = SP1 if @X !=0 begin rollback transaction return 1 end commit transaction -------------------------- В этом случае ненадо менять вызываемую процедуру + это работет у меня . (и очень неплохо ..) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.10.2001, 05:53 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32015654&tid=1825257]: |
0ms |
get settings: |
8ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
| others: | 250ms |
| total: | 377ms |

| 0 / 0 |
