powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как лучше обробатывать ошибки в TSQL?
10 сообщений из 10, страница 1 из 1
Как лучше обробатывать ошибки в TSQL?
    #32050017
Фотография Ден
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня такой вопросик, есть хранимая процедура в которой запускается мнооого запросов. Как мне проверить была ли ошибка выполнения хоть одного из них, если была , то откатить транзакцию.
Я делал так
после каждого запроса ставил, но это очень некрасиво выходит..
select @err=@@error
if len(@err)>0
begin
set @msg='Error: '+ @err
raiserror(@msg,16,1)
rollback tran
return 0
end
...
Рейтинг: 0 / 0
Как лучше обробатывать ошибки в TSQL?
    #32050020
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SET XACT_ABORT ON
и оно само все сделается
...
Рейтинг: 0 / 0
Как лучше обробатывать ошибки в TSQL?
    #32050022
Фотография Lexis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пример из BOL

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BEGIN TRAN
  UPDATE Northwind.dbo.Products
  SET UnitPrice = UnitPrice *  1 . 1 
  WHERE CategoryID IN ( 1 ,  2 ,  5 ,  6 )
  
IF @@ERROR =  547 
  PRINT 'A CHECK CONSTRAINT violation occurred'
IF @@ROWCOUNT =  0  
  PRINT 'No rows updated.'
ELSE
  PRINT STR(@@ROWCOUNT) + ' rows updated.'
COMMIT  -- Commits rows successfully updated.
 

...
Рейтинг: 0 / 0
Как лучше обробатывать ошибки в TSQL?
    #32050023
Фотография Ден
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
...
Рейтинг: 0 / 0
Как лучше обробатывать ошибки в TSQL?
    #32050025
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
if len(@err)>0 - ошибка: len только для строк.

Удобнее всего использовать некрасивый оператор goto:

/*после каждого оператора*/
if @@error<> 0 goto Err
...
return 0
Err:
rollback tran
return -1

А raiserror будет вызываться сам.
...
Рейтинг: 0 / 0
Как лучше обробатывать ошибки в TSQL?
    #32050028
Sanek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно упростить примерно так :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Select ...
select @err=@@error 
if len(@err)> 0  GOTO ERR
Select ...
select @err=@@error 
if len(@err)> 0  GOTO ERR

GOTO END_PROC
ERR: 
set @msg='Error: '+ @err 
raiserror(@msg, 16 , 1 ) 
rollback tran 
return  0  
END_PROC:
Commit tran
Return  0 


Но я делал подругому ...
каждый запрос оформлял в процедуре ...
и получалось так :
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
exec @success = stored_procedure
if @success !=  0  GOTO ERROR
exec @success = stored_procedure
if @success !=  0  GOTO ERROR
.
.
.
GOTO END_PROC
ERR:
ROLLBACK TRAN
RETURN ErrorCode
END_PROC:
COMMIT TRAN
RETURN  0 


Ничего не тестировал ... написано для примера ...
...
Рейтинг: 0 / 0
Как лучше обробатывать ошибки в TSQL?
    #32050032
Фотография Ден
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для Lexis, но на сколько я знаю, этот обаботчик работает только для последнего запроса... Те. если следущий запрос без ошибок, то @@error=0... А ставить такой обработчик для N-ого колличества запросов (их ооочень много) ломает... Хотя может я что то не понимаю.. SET XACT_ABORT ON подходит, но в этом случае выводится системная ошибка, юзеры нифига не поймут -))
...
Рейтинг: 0 / 0
Как лучше обробатывать ошибки в TSQL?
    #32050039
Фотография Ден
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо всем! Я понял одно, что после каждого запроса (или вызова процедуры) мне придется делать проверку..-(((
Для alexeyvg, я считываю @@error в переменную varchar (для формирования в дальнейшем строки сообщения)
...
Рейтинг: 0 / 0
Как лучше обробатывать ошибки в TSQL?
    #32050049
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
близкий к теме вопрос:
если внутри транзакции произошла "ашипка" синтаксиса (типа в селекте указано поле которого нет в таблице), то хп тут-же прекращает свою работу и до проверки на ошибку и откат транзакции просто не доходит и эта транзакция просто "зависает". Причем, единственный способ - это перехватить ошибку в приложении и оборвать конекшн. Как с этим бороться более цивилизованно?
...
Рейтинг: 0 / 0
Как лучше обробатывать ошибки в TSQL?
    #32050069
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А в catch (except, finally) засунуть ROLLBACK?

Если взять себе за золотое правило объявлять транзакции внутри sp и там же их закрывать, то на такие грабли и на многие другие просто никогда не наступить.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как лучше обробатывать ошибки в TSQL?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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