|
|
|
Как лучше обробатывать ошибки в TSQL?
|
|||
|---|---|---|---|
|
#18+
У меня такой вопросик, есть хранимая процедура в которой запускается мнооого запросов. Как мне проверить была ли ошибка выполнения хоть одного из них, если была , то откатить транзакцию. Я делал так после каждого запроса ставил, но это очень некрасиво выходит.. select @err=@@error if len(@err)>0 begin set @msg='Error: '+ @err raiserror(@msg,16,1) rollback tran return 0 end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2002, 12:53:01 |
|
||
|
Как лучше обробатывать ошибки в TSQL?
|
|||
|---|---|---|---|
|
#18+
SET XACT_ABORT ON и оно само все сделается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2002, 12:55:48 |
|
||
|
Как лучше обробатывать ошибки в TSQL?
|
|||
|---|---|---|---|
|
#18+
пример из BOL Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2002, 12:57:02 |
|
||
|
Как лучше обробатывать ошибки в TSQL?
|
|||
|---|---|---|---|
|
#18+
Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2002, 12:57:22 |
|
||
|
Как лучше обробатывать ошибки в TSQL?
|
|||
|---|---|---|---|
|
#18+
if len(@err)>0 - ошибка: len только для строк. Удобнее всего использовать некрасивый оператор goto: /*после каждого оператора*/ if @@error<> 0 goto Err ... return 0 Err: rollback tran return -1 А raiserror будет вызываться сам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2002, 12:58:58 |
|
||
|
Как лучше обробатывать ошибки в TSQL?
|
|||
|---|---|---|---|
|
#18+
можно упростить примерно так : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Но я делал подругому ... каждый запрос оформлял в процедуре ... и получалось так : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Ничего не тестировал ... написано для примера ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2002, 13:00:34 |
|
||
|
Как лучше обробатывать ошибки в TSQL?
|
|||
|---|---|---|---|
|
#18+
Для Lexis, но на сколько я знаю, этот обаботчик работает только для последнего запроса... Те. если следущий запрос без ошибок, то @@error=0... А ставить такой обработчик для N-ого колличества запросов (их ооочень много) ломает... Хотя может я что то не понимаю.. SET XACT_ABORT ON подходит, но в этом случае выводится системная ошибка, юзеры нифига не поймут -)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2002, 13:04:06 |
|
||
|
Как лучше обробатывать ошибки в TSQL?
|
|||
|---|---|---|---|
|
#18+
Спасибо всем! Я понял одно, что после каждого запроса (или вызова процедуры) мне придется делать проверку..-((( Для alexeyvg, я считываю @@error в переменную varchar (для формирования в дальнейшем строки сообщения) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2002, 13:11:43 |
|
||
|
Как лучше обробатывать ошибки в TSQL?
|
|||
|---|---|---|---|
|
#18+
близкий к теме вопрос: если внутри транзакции произошла "ашипка" синтаксиса (типа в селекте указано поле которого нет в таблице), то хп тут-же прекращает свою работу и до проверки на ошибку и откат транзакции просто не доходит и эта транзакция просто "зависает". Причем, единственный способ - это перехватить ошибку в приложении и оборвать конекшн. Как с этим бороться более цивилизованно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2002, 13:30:43 |
|
||
|
Как лучше обробатывать ошибки в TSQL?
|
|||
|---|---|---|---|
|
#18+
А в catch (except, finally) засунуть ROLLBACK? Если взять себе за золотое правило объявлять транзакции внутри sp и там же их закрывать, то на такие грабли и на многие другие просто никогда не наступить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.09.2002, 14:05:26 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32050022&tid=1820399]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
30ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 295ms |

| 0 / 0 |
