powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Обработка ошибок
5 сообщений из 5, страница 1 из 1
Обработка ошибок
    #32028846
Faza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Срочно HELP.
в хранимой процедуре открываю транзакцию, выполняю запрос и получаю код ошибки.
В конце процедуры я обрабатываю ошибку с целью завершения или отката транзакции.
После выполненния заведомо ошибочного запросв поставил банальный PRINT, но до него процедура не доходит, а
вываливается. В query Analizer выдается две ошибки: одна на запрос, другая на несоответствие счетчика транзакций (код 266).(см. Пример).

...
begin transaction
...
insert into ....
set @err = @@error
print 'aaa'
...
if @err != 0
rollback trnsaction
else
commit transaction

Есть ли возсожность корректно обработать ошибку и закончить в ту или иную сторону транзакцию????????
...
Рейтинг: 0 / 0
Обработка ошибок
    #32028854
Andrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотри для начала: BOL - Accessing and Changing Data Fundamentals - Using Multiple Statements - Batches
А счетчик транзакций может слететь к примеру если используешь Dynamic SQL.
...
Рейтинг: 0 / 0
Обработка ошибок
    #32028858
bik_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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. Приведи пример, плиз, если это так.
...
Рейтинг: 0 / 0
Обработка ошибок
    #32028887
Faza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Одно маленькое упущение. Когда запрос верный (см. первое сообщение), то процедура проходит чисто.
...
Рейтинг: 0 / 0
Обработка ошибок
    #32028895
Andrew
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Обработка ошибок
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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