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

Откуда: Novosibirsk
Сообщений: 1873
В процедуре с выходным параметром генерится ошибка.
Почему при обычном вызове параметр инициализируется
а при вызове в блоке try..catch нет

IF Object_ID('dbo.testprocerror') IS NOT NULL DROP PROCEDURE [dbo].[testprocerror]
GO
CREATE procedure [dbo].[testprocerror] @id int output
as
begin
	set  @id  = 3
	raiserror('error1',16,1)
end
GO


declare @id int

set @id = 0
exec dbo.testprocerror @id OUTPUT
print @id

set @id = 0
BEGIN TRY
		exec dbo.testprocerror @id OUTPUT
END TRY
BEGIN CATCH
print error_message()
END CATCH
print @id
14 май 13, 13:58    [14292682]     Ответить | Цитировать Сообщить модератору
 Re: не инициализируется выходной параметр процедуры в блоке try.. catch  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
IF Object_ID('dbo.testprocerror') IS NOT NULL DROP PROCEDURE [dbo].[testprocerror]
GO
CREATE procedure [dbo].[testprocerror] @id int output
as
begin
	set  @id  = 3
	raiserror('error1',16,1)
	set @id = @id + 1;
end
GO


declare @id int

set @id = 0
exec dbo.testprocerror @id OUTPUT
print @id

set @id = 0
BEGIN TRY
		exec dbo.testprocerror @id OUTPUT
END TRY
BEGIN CATCH
print error_message()
END CATCH
print @id
24 май 13, 07:50    [14342140]     Ответить | Цитировать Сообщить модератору
 Re: не инициализируется выходной параметр процедуры в блоке try.. catch  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
tpg> set @id = @id + 1

и что - это что-то меняет?
24 май 13, 09:14    [14342439]     Ответить | Цитировать Сообщить модератору
 Re: не инициализируется выходной параметр процедуры в блоке try.. catch  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
daw
tpg> set @id = @id + 1

и что - это что-то меняет?
Этим я хотел показать, что raiserror ну никак не меняет поведения выполнения процедуры.
А TRY...CATCH все же работает как и задумывалось - при возникновении ошибки переходит в блок CATCH и с результатом, что как будто бы ничего не выполнилось. И это ожидаемо.
24 май 13, 09:21    [14342481]     Ответить | Цитировать Сообщить модератору
 Re: не инициализируется выходной параметр процедуры в блоке try.. catch  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Из экспериментов очевидно, что с точки зрения реализации SQL, OUTPUT параметр (в данном случае @id) процедуры - это не ссылка на внешнюю переменную @id, а все же внутренняя переменная процедуры, которая "выливается" во внешнюю в момент когда происходит RETURN у процедуры. Если до RETURN дело не дошло, значение переменной не вернется из процедуры, а останется тем что было до вызова.
24 май 13, 09:50    [14342706]     Ответить | Цитировать Сообщить модератору
 Re: не инициализируется выходной параметр процедуры в блоке try.. catch  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
> и с результатом, что как будто бы ничего не выполнилось

с чего это "как будто бы ничего не выполнилось"? вот так после ошибки вполне себе измененное значение получим:
declare @id int;
set @id = 0;
begin try
set @id = 3;
raiserror('!!!', 16, 1);
end try
begin catch
print error_message();
end catch
print @id;


там, насколько я понимаю, в другом дело. просто output-переменные так в t-sql работают. на самом деле, передается всегда значение. при начале выполнения процедуры это значение копируется в некую... эээ.... скажем, "внутреннюю переменную", а при окончании - обратно (пруфа не дам: кто-то писал об этом, но сейчас, увы, ссылки не найду). в случае же с try-catch управление после ошибки сразу же передается в catch и обратного копирования не происходит.
собственно, да - поведение такое by design, видимо. можно, конечно и попробовать в connect пожаловаться - посмотреть что ответят.
24 май 13, 09:54    [14342747]     Ответить | Цитировать Сообщить модератору
 Re: не инициализируется выходной параметр процедуры в блоке try.. catch  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
tpg
daw
tpg> set @id = @id + 1

и что - это что-то меняет?
Этим я хотел показать, что raiserror ну никак не меняет поведения выполнения процедуры.
А TRY...CATCH все же работает как и задумывалось - при возникновении ошибки переходит в блок CATCH и с результатом, что как будто бы ничего не выполнилось. И это ожидаемо.


Это то понятно. Просто вопрос был различной обработки выходного параметра
и похоже как заметили ambarka_max и daw при попадании в CATCH сервер на выходные параметры ложит болт.
24 май 13, 10:04    [14342834]     Ответить | Цитировать Сообщить модератору
 Re: не инициализируется выходной параметр процедуры в блоке try.. catch  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1873
хотя мог бы и вернуть их значения на момент возникновения ошибки - как содержимое "чёрного" ящика :)
24 май 13, 10:07    [14342854]     Ответить | Цитировать Сообщить модератору
 Re: не инициализируется выходной параметр процедуры в блоке try.. catch  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну, я, вообще-то, процедуру и имел в виду.
24 май 13, 11:00    [14343298]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить