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

Откуда: Киев
Сообщений: 17
Объясните!
Почему когда курсор валится на какой-то записи не происходит ROLLBACK TRAN
Тоесть половина записей вставляется, а после ошибки нет… Где крутить? Спасибо

BEGIN TRAN

OPEN cur_items

FETCH NEXT FROM cur_items INTO @SOURCE,@SN,@YEAR,@NOTES,@TZ1,@TZ2,@TZ3,@TZ4,@TZ5,@PZ1,@PZ2,@PZ3,@PZ4,@PZ5,
@WRITEOFF,@WRITEOFFTP,@N1,@N2,@N3,@N4,@N5,@ZC1,@ZC2,@ZC3,@ZC4,@ZC5,@NEEDLIFE,@NEEDWAR
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @IDSOURCE=(SELECT Id FROM items WHERE Source = @SOURCE and Shapes = @SHAPES)
IF @IDSOURCE is null
BEGIN
EXECUTE mdf_items 'INSERT',0,@SHAPES,@SOURCE,0,@SN,@YEAR,@NOTES,@TZ1,@TZ2,@TZ3,@TZ4,@TZ5,0,@PZ1,@PZ2,@PZ3,@PZ4,@PZ5,0,
@WriteOff,@WriteOffTP,0,@N1,@N2,@N3,@N4,@N5,0,@ZC1,@ZC2,@ZC3,@ZC4,@ZC5,0,0,0
END
FETCH NEXT FROM cur_items INTO @SOURCE,@SN,@YEAR,@NOTES,@TZ1,@TZ2,@TZ3,@TZ4,@TZ5,@PZ1,@PZ2,@PZ3,@PZ4,@PZ5,
@WriteOff,@WriteOffTP,@N1,@N2,@N3,@N4,@N5,@ZC1,@ZC2,@ZC3,@ZC4,@ZC5,@NEEDLIFE,@NEEDWAR
END
CLOSE cur_items
DEALLOCATE cur_items

IF (@@error <> 0) ROLLBACK TRAN
IF (@@trancount = 0) COMMIT TRAN
25 июл 09, 21:16    [7460382]     Ответить | Цитировать Сообщить модератору
 Re: Обьястите ROLLBACK TRAN  [new]
Glory
Member

Откуда:
Сообщений: 104760
Переменная @@error есть результат выполнения последней команды. А не результат последней ошибочной команды.
25 июл 09, 21:27    [7460388]     Ответить | Цитировать Сообщить модератору
 Re: Обьястите ROLLBACK TRAN  [new]
tenax
Member

Откуда: Киев
Сообщений: 17
Glory,
А какая разница? Она все равно больше нуля если ошибка!
или надо @@ FETCH_STATUS проверять на 0. Как-то по крестьянски. Спасибо
25 июл 09, 21:31    [7460395]     Ответить | Цитировать Сообщить модератору
 Re: Обьястите ROLLBACK TRAN  [new]
tenax
Member

Откуда: Киев
Сообщений: 17
Glory,
Значит так надо?

BEGIN TRAN

OPEN cur_items

FETCH NEXT FROM cur_items INTO @SOURCE,@SN,@YEAR,@NOTES,@TZ1,@TZ2,@TZ3,@TZ4,@TZ5,@PZ1,@PZ2,@PZ3,@PZ4,@PZ5,
@WRITEOFF,@WRITEOFFTP,@N1,@N2,@N3,@N4,@N5,@ZC1,@ZC2,@ZC3,@ZC4,@ZC5,@NEEDLIFE,@NEEDWAR
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @IDSOURCE=(SELECT Id FROM items WHERE Source = @SOURCE and Shapes = @SHAPES)
IF @IDSOURCE is null
BEGIN
EXECUTE mdf_items 'INSERT',0,@SHAPES,@SOURCE,0,@SN,@YEAR,@NOTES,@TZ1,@TZ2,@TZ3,@TZ4,@TZ5,0,@PZ1,@PZ2,@PZ3,@PZ4,@PZ5,0,
@WriteOff,@WriteOffTP,0,@N1,@N2,@N3,@N4,@N5,0,@ZC1,@ZC2,@ZC3,@ZC4,@ZC5,0,0,0
END
IF (@@error <> 0) ROLLBACK TRAN
FETCH NEXT FROM cur_items INTO @SOURCE,@SN,@YEAR,@NOTES,@TZ1,@TZ2,@TZ3,@TZ4,@TZ5,@PZ1,@PZ2,@PZ3,@PZ4,@PZ5,
@WriteOff,@WriteOffTP,@N1,@N2,@N3,@N4,@N5,@ZC1,@ZC2,@ZC3,@ZC4,@ZC5,@NEEDLIFE,@NEEDWAR
END
CLOSE cur_items
DEALLOCATE cur_items

IF (@@trancount = 0) COMMIT TRAN
25 июл 09, 21:37    [7460401]     Ответить | Цитировать Сообщить модератору
 Re: Обьястите ROLLBACK TRAN  [new]
tenax
Member

Откуда: Киев
Сообщений: 17
Glory, это поможет
BEGIN TRY
BEGIN TRAN
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
END CATCH
25 июл 09, 22:14    [7460467]     Ответить | Цитировать Сообщить модератору
 Re: Обьястите ROLLBACK TRAN  [new]
Джонни Кейдж
Member

Откуда: стольный град Киев
Сообщений: 31
tenax,

IF (@@trancount = 0) COMMIT TRAN - это как понимать?

Может, все-таки условие должно быть @@trancount > 0 ?

А по теме - надо использовать конструкцию

BEGIN TRY
BEGIN TRAN
...
IF @@TRANCOUNT > 0
COMMIT TRAN
END TRY

BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
END CATCH
26 июл 09, 00:16    [7460711]     Ответить | Цитировать Сообщить модератору
 Re: Обьястите ROLLBACK TRAN  [new]
tenax
Member

Откуда: Киев
Сообщений: 17
Джонни Кейдж,

Спасибо. Разобрался.
IF (@@trancount = 0) COMMIT TRAN - это как понимать?
Согласен. Бред. Исправил.
Конструкцию try..catch уже использую. Спасибо.
26 июл 09, 01:45    [7460774]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить