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

Подскажите, пожалуйста, почему при следующем вызове процедуры
Код: 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
06.02.2020, 23:18
    #39923695
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return в хранимой процедуре
straybullet,

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

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

С другой стороны, зачем что-то писать после безусловного выходя из процедуры?...
...
Рейтинг: 0 / 0
07.02.2020, 09:15
    #39923756
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return в хранимой процедуре
Гавриленко Сергей Алексеевич
С другой стороны, зачем что-то писать после безусловного выходя из процедуры?...
Это же нормальный стиль программирования. 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
07.02.2020, 09:40
    #39923760
straybullet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return в хранимой процедуре
Спасибо за ваши ответы. Тоже склоняюсь к мнению, что это баг. Причина, по которой я решил воспользоваться return, заключалась в том, что изначально процедура не возвращала число строк, а когда это понадобилось в одной точке вызова, то в других (где число строк не требуется) не пришлось бы менять код (а output-параметры не могут быть опциональными). Буду репортить.
...
Рейтинг: 0 / 0
07.02.2020, 10:20
    #39923779
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return в хранимой процедуре
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
07.02.2020, 10:27
    #39923784
entrypoint
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return в хранимой процедуре
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
07.02.2020, 10:36
    #39923794
straybullet
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
return в хранимой процедуре
alexeyvg,

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


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