Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как лучше обробатывать ошибки в TSQL? / 10 сообщений из 10, страница 1 из 1
12.09.2002, 12:53:01
    #32050017
Ден
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше обробатывать ошибки в TSQL?
У меня такой вопросик, есть хранимая процедура в которой запускается мнооого запросов. Как мне проверить была ли ошибка выполнения хоть одного из них, если была , то откатить транзакцию.
Я делал так
после каждого запроса ставил, но это очень некрасиво выходит..
select @err=@@error
if len(@err)>0
begin
set @msg='Error: '+ @err
raiserror(@msg,16,1)
rollback tran
return 0
end
...
Рейтинг: 0 / 0
12.09.2002, 12:55:48
    #32050020
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше обробатывать ошибки в TSQL?
SET XACT_ABORT ON
и оно само все сделается
...
Рейтинг: 0 / 0
12.09.2002, 12:57:02
    #32050022
Lexis
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше обробатывать ошибки в TSQL?
пример из 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
12.09.2002, 12:57:22
    #32050023
Ден
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше обробатывать ошибки в TSQL?
Спасибо!
...
Рейтинг: 0 / 0
12.09.2002, 12:58:58
    #32050025
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше обробатывать ошибки в TSQL?
if len(@err)>0 - ошибка: len только для строк.

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

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

А raiserror будет вызываться сам.
...
Рейтинг: 0 / 0
12.09.2002, 13:00:34
    #32050028
Sanek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше обробатывать ошибки в TSQL?
можно упростить примерно так :
Код: 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
12.09.2002, 13:04:06
    #32050032
Ден
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше обробатывать ошибки в TSQL?
Для Lexis, но на сколько я знаю, этот обаботчик работает только для последнего запроса... Те. если следущий запрос без ошибок, то @@error=0... А ставить такой обработчик для N-ого колличества запросов (их ооочень много) ломает... Хотя может я что то не понимаю.. SET XACT_ABORT ON подходит, но в этом случае выводится системная ошибка, юзеры нифига не поймут -))
...
Рейтинг: 0 / 0
12.09.2002, 13:11:43
    #32050039
Ден
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше обробатывать ошибки в TSQL?
Спасибо всем! Я понял одно, что после каждого запроса (или вызова процедуры) мне придется делать проверку..-(((
Для alexeyvg, я считываю @@error в переменную varchar (для формирования в дальнейшем строки сообщения)
...
Рейтинг: 0 / 0
12.09.2002, 13:30:43
    #32050049
Hibernate
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше обробатывать ошибки в TSQL?
близкий к теме вопрос:
если внутри транзакции произошла "ашипка" синтаксиса (типа в селекте указано поле которого нет в таблице), то хп тут-же прекращает свою работу и до проверки на ошибку и откат транзакции просто не доходит и эта транзакция просто "зависает". Причем, единственный способ - это перехватить ошибку в приложении и оборвать конекшн. Как с этим бороться более цивилизованно?
...
Рейтинг: 0 / 0
12.09.2002, 14:05:26
    #32050069
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше обробатывать ошибки в TSQL?
А в catch (except, finally) засунуть ROLLBACK?

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


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