powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / return в хранимой процедуре
8 сообщений из 8, страница 1 из 1
return в хранимой процедуре
    #39923693
straybullet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Подскажите, пожалуйста, почему при следующем вызове процедуры
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
create proc #test1
as
begin
	set nocount on;
	
	create table #t (id int);

	insert into #t
	select id
	from (values (1), (2)) t(id);

	return (select count(*) from #t);

	select *
	from #t;
end;

go

declare @c int;
exec @c = #test1;
select @c;

go

drop proc #test1



в студии будет выведено и количество строк (в переменной @c), и содержимое таблицы #t (т.е. не произойдет безусловный выход по инструкции return)? При этом, если заменить временную таблицу на табличную переменную, либо предварительно сохранить результат select count(*) в переменную, то выход срабатывает.

Код: sql
1.
2.
3.
4.
Microsoft SQL Server 2014 (SP3-CU1) (KB4470220) - 12.0.6205.1 (X64) 
	Nov 30 2018 02:59:03 
	Copyright (c) Microsoft Corporation
	Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
...
Рейтинг: 0 / 0
return в хранимой процедуре
    #39923695
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
straybullet,

какая-то недокументированная конструкция. Так будет соответствовать:

Код: sql
1.
2.
	declare @r int = (select count(*) from #t);
	return @r;
...
Рейтинг: 0 / 0
return в хранимой процедуре
    #39923713
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже на багу. Воспроизводится только если селектить в return их времянки (табличная переменная или перманентная таблица дают ожидаемый результат). Воспроизводится на 2016. Можно репортить.

С другой стороны, зачем что-то писать после безусловного выходя из процедуры?...
...
Рейтинг: 0 / 0
return в хранимой процедуре
    #39923756
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гавриленко Сергей Алексеевич
С другой стороны, зачем что-то писать после безусловного выходя из процедуры?...
Это же нормальный стиль программирования. return и нужен, что бы при каких то условиях выйти из процедуры, а возврат значения - это дополнительная фича инструкции return.
Скажем, я проверяю баланс счёта, если бабла не хватает, то выход, или начинаю списание денег.
А тут инструкция "return" игнорируется, и продолжается выполнение, начинается процесс списывания денег.

straybullet,
Другое дело, вопрос: "а зачем возвращать значение инструкцией return?"
В T-SQL принято, что процедуры возвращают код ошибки, или возвращаемое значение вообще не используется.
А возвращают скалярные значения параметром с свойством output
Код: sql
1.
2.
3.
4.
5.
create proc #test1 @c int output
as
...
...
exec #test1 @c = @c output;
...
Рейтинг: 0 / 0
return в хранимой процедуре
    #39923760
straybullet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ваши ответы. Тоже склоняюсь к мнению, что это баг. Причина, по которой я решил воспользоваться return, заключалась в том, что изначально процедура не возвращала число строк, а когда это понадобилось в одной точке вызова, то в других (где число строк не требуется) не пришлось бы менять код (а output-параметры не могут быть опциональными). Буду репортить.
...
Рейтинг: 0 / 0
return в хранимой процедуре
    #39923779
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
straybullet
а output-параметры не могут быть опциональными
Могут.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
create proc #test1
	@c int = null output
as
begin
	set nocount on;
	
	create table #t (id int);

	insert into #t
	select id
	from (values (1), (2)) t(id);

	select @c = count(*) from #t
	return

	select *
	from #t;
end;

go

declare @c int;
exec #test1;
exec #test1 @c = @c output;
select @c;

go

drop proc #test1
...
Рейтинг: 0 / 0
return в хранимой процедуре
    #39923784
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
straybullet,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
create proc #test1
as
begin
	set nocount on;
	
	create table #t (id int);

	insert into #t
	select id
	from (values (1), (2)) t(id);

	-- return (select count(*) from #t);
	return @@ROWCOUNT

	select *
	from #t;
end;

go

declare @c int;
exec @c = #test1;
select @c;

go

drop proc #test1
...
Рейтинг: 0 / 0
return в хранимой процедуре
    #39923794
straybullet
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

Не знал, благодарю.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / return в хранимой процедуре
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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