Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 CATCH с кодом серьезности до 10  [new]
kuban_nsi
Guest
Добрый день.
Вопрос о TRY...CATCH в хранимках
В помощи SQL написано:
Конструкция TRY...CATCH перехватывает все ошибки исполнения с кодом серьезности, большим 10, которые не прерывают соединения с базой данных.
А что делать до 10.
Уперся на:
BEGIN TRANSACTION;
BEGIN TRY
DELETE FROM [tbPRKON_TU] WHERE [id_TU] = @_ID_TU
DELETE FROM [tbADRES_TU] WHERE [id_TU] = @_ID_TU
DELETE FROM [tbPRMIN_TU] WHERE [id_TU] = @_ID_TU
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
RETURN (1);
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
RETURN (-1)
END CATCH
Тупо ошибся в коде, указал несуществующую таблицу для DELETE и получил ошибку после выполнения ХП:

"Количество транзакций после EXECUTE показывает, что отсутствует инструкция COMMIT или ROLLBACK TRANSACTION. Предыдущее количество = 0, текущее количество = 1."
Получается ROLLBACK TRANSACTION не отработал в блоке CATCH, и на сервере осталась зависшая транзакция. Подскажите, пож., КАК С ЭТИМ ПОБОРОТЬСЯ?
3 июл 09, 12:06    [7372642]     Ответить | Цитировать Сообщить модератору
 Re: CATCH с кодом серьезности до 10  [new]
tt12
Member

Откуда: Ленинград
Сообщений: 86
Ошибку 208 можно обработать только с клиента.
3 июл 09, 12:16    [7372705]     Ответить | Цитировать Сообщить модератору
 Re: CATCH с кодом серьезности до 10  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36805
tt12
Ошибку 208 можно обработать только с клиента.
Да ну конечно.

if object_id('tempdb..#p') is not null
    drop proc #p
go    
create proc #p
as begin
    begin try
        select * from #non_existing_table
    end try
    begin catch
        print 'Error message in procedure: ' + error_message()
    end catch        
end
go

begin try
    exec #p
end try
begin catch
    print 'Error message out of procedure: ' + error_message()
end catch
3 июл 09, 12:20    [7372733]     Ответить | Цитировать Сообщить модератору
 Re: CATCH с кодом серьезности до 10  [new]
tt12
Member

Откуда: Ленинград
Сообщений: 86
Гавриленко Сергей Алексеевич
спасибо, будем знать
3 июл 09, 12:29    [7372806]     Ответить | Цитировать Сообщить модератору
 Re: CATCH с кодом серьезности до 10  [new]
kuban_nsi
Guest
Гавриленко Сергей Алексеевич, спасибо.
Обернуть запуск ХП в дополнительный, примерно так !??
if object_id('tempdb..#p') is not null
    drop proc #p
go    
create proc #p
as begin
	create table #aa (id int)
	INSERT INTO #aa (id) VALUES (1)
	INSERT INTO #aa (id) VALUES (2)
	SELECT * FROM #aa
	BEGIN TRANSACTION
    begin try
        --select * from #non_existing_table
		DELETE FROM #aa WHERE id = 2
		DELETE FROM #non_existing_table WHERE id = 2
		COMMIT TRANSACTION
    end try
    begin catch
        print 'Error message in procedure: ' + error_message()
		ROLLBACK TRANSACTION
    end catch        
	SELECT * FROM #aa
end
go

begin try
    exec #p
end try
begin catch
    print 'Error message out of procedure: ' + error_message()
	SELECT @@TRANCOUNT
	-- 1
	IF @@TRANCOUNT > 0
	        ROLLBACK TRANSACTION;
	SELECT @@TRANCOUNT
	-- 0
end catch
3 июл 09, 13:28    [7373259]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить