Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Обработка ошибок  [new]
Paul Chabinsky
Member

Откуда:
Сообщений: 322
У меня есть две ХП, одна вложена в другую. Во вложенной процедуре эт-рантайм происходит ошибка, причем происходит так, что батч вложенной ХП вообще не выполняется. Вопрос в том как мне отследить наличие ошибки, если я не могу сделать RETURN т.к. батч не выполняется вообще.
29 апр 04, 16:52    [657790]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
@@error
29 апр 04, 17:00    [657820]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок  [new]
Paul Chabinsky
Member

Откуда:
Сообщений: 322
мелкое уточнение.


hp1:
begin tran

exec @err_val = hp2
if @err_val = 0
commit
else
rollback

hp2:
set arithabirt off

--инсерт в таблицу по которой нет indexed view

@err_val = @err_val + @@error
--инсерт в таблицу по которой есть indexed view

@err_val = @err_val + @@error
return @err_val


при вызове exec @err_val = hp2 в hp2 после set не выполняется даже первый инсерт ... сразу прерывается батч (ощущение будто парсер разбирает синтаксис и видит что с такими сет-опциями не сможет выполнить второй запрос кидает эксепшн 16,1 и прерывает батч ... при этом роллбак не происходит)
29 апр 04, 17:05    [657845]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
вОТ ЧТО УМНЫЕ ЛЮДИ ГОВОРЯТ
29 апр 04, 17:33    [657919]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок  [new]
nandji
Member

Откуда:
Сообщений: 186
автор
при этом роллбак не происходит)

вот блин вилы %)
неужели в таком случае решением будет только транзакция с клиента?
30 апр 04, 12:50    [659442]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Вообще после exec надо сначала @@error проверить , а потом только результат
Клиентской транзакции не надо , надо на клиенте всегда проверять ошибки и в некоторых случаях делать rollback :)
Или корректно пользоваться штатным пулом соединений - он это делает сам
30 апр 04, 12:52    [659451]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок  [new]
жора
Guest
2 Crimean

Или корректно пользоваться штатным пулом соединений - он это делает сам

Если можно поподробнее
30 апр 04, 13:05    [659495]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок  [new]
nandji
Member

Откуда:
Сообщений: 186
так ...
меня в заблуждение ввел QA дебагер (или я его ;))
мысль проверить @@error сразу после exec была .. но была забрита после того как дебагер просто остановил выполнение при возникновении ошибки ...
я счел это как сигнал о том что при выполнении хп происходит тоже самое что и при дебаг ... ;)
почему дебагер так себя ведет .. это бай дизайн или у меня что то не так ?
30 апр 04, 13:07    [659503]     Ответить | Цитировать Сообщить модератору
 Re: Обработка ошибок  [new]
Crimean
Member

Откуда:
Сообщений: 13148
declare @i int

select @i = 123
exec @i = nonexistingproc
select @@error
select @i


В результате:

Server: Msg 2812, Level 16, State 62, Line 3

Could not find stored procedure 'nonexistingproc'.

-----------

2812

(1 row(s) affected)


-----------

123

(1 row(s) affected)


То есть сначала @@error , потом - код возврата .

Насчет "правильного использования" - взял конекшн, дернул запрос, вернул конекшн.
30 апр 04, 13:26    [659575]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить