Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Обработка ошибок
|
|||
|---|---|---|---|
|
#18+
Срочно HELP. в хранимой процедуре открываю транзакцию, выполняю запрос и получаю код ошибки. В конце процедуры я обрабатываю ошибку с целью завершения или отката транзакции. После выполненния заведомо ошибочного запросв поставил банальный PRINT, но до него процедура не доходит, а вываливается. В query Analizer выдается две ошибки: одна на запрос, другая на несоответствие счетчика транзакций (код 266).(см. Пример). ... begin transaction ... insert into .... set @err = @@error print 'aaa' ... if @err != 0 rollback trnsaction else commit transaction Есть ли возсожность корректно обработать ошибку и закончить в ту или иную сторону транзакцию???????? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2002, 15:53 |
|
||
|
Обработка ошибок
|
|||
|---|---|---|---|
|
#18+
Посмотри для начала: BOL - Accessing and Changing Data Fundamentals - Using Multiple Statements - Batches А счетчик транзакций может слететь к примеру если используешь Dynamic SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2002, 17:30 |
|
||
|
Обработка ошибок
|
|||
|---|---|---|---|
|
#18+
2Faza: Ессно, есть! Главное - проверить, что твоя транзакция не вложенная, а если она вложенная, т о не надо открывать свою, а просто сделай сэйвпоинт. Пример: \nCREATE PROC MyProc AS SET NOCOUNT ON DECLARE @TranCounter int SELECT @TranCounter = @@TRANCOUNT ... -- Здесь вся работа, не модифицирующая ничего (типа калькуляций всяких.) -- Группируй тут, дабы уменьшить продолжительность транзакции ... if @TranCounter=0 BEGIN TRAN MyTran else SAVE TRAN MyTran ... INSERT ... if NOT @@ERROR = 0 begin ROLLBACK TRAN MyTran -- откатываемся либо до сэйвпоинта, либо вообще RETURN 8798 -- свой код ошибки end ... UPDATE ... ... DELETE ... if @TranCounter=0 COMMIT TRAN GO Скорее всего, проблема именно во вложенности транзакций. И еще: rollback trnsaction - опечатался при наборе? 2Andrew: Ни разу Dynamic SQL не глючил на @@TRANCOUNT. Приведи пример, плиз, если это так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2002, 19:28 |
|
||
|
Обработка ошибок
|
|||
|---|---|---|---|
|
#18+
Одно маленькое упущение. Когда запрос верный (см. первое сообщение), то процедура проходит чисто. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2002, 06:02 |
|
||
|
Обработка ошибок
|
|||
|---|---|---|---|
|
#18+
2bik_: Я не имел ввиду что Dynamic SQL - глючит. Я хотел сказать что при неправильном использовании транзакций и Dynamic SQL можно получить ошибку несоответствия счетчика транзакций. Вот пример типичной ошибки: create proc f2 @s varchar(10) as begin tran exec('insert into [a] values('+ @s +')') if @@error <> 0 rollback tran else commit tran GO create proc f1 @s varchar(10) as begin tran exec('insert into [a] values('+ @s +')') if @@error <> 0 rollback tran else commit tran set @s = @s + @s exec f2 @s GO create proc f3 as declare @s varchar(10) set @s = '''' + 'a' + '''' print @s create table a(b varchar(1)) begin tran -- Здесь типа что-то делается exec f1 @s -- commit tran select * from a drop table a GO exec f3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.04.2002, 06:49 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32028895&tid=1822938]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 327ms |

| 0 / 0 |
