create or alter procedure p as begin
set nocount on;
return 1000; -- whatever value I want it to be
end
go
declare @returnvalue int;
exec @returnvalue = p;
print concat('return value was ',@returnvalue); -- prints "return value was 1000"
go
这次我把return语句注解掉了。该过程将返回默认值0:
create or alter procedure p as begin
set nocount on;
-- return 1000; comment out the return -> no explicit return value
end
go
-- this code will print "return value was 0" because that's the default
declare @returnvalue int;
exec @returnvalue = p;
print concat('return value was ', @returnvalue);
go
create or alter procedure p as begin
set nocount on;
begin try
-- deliberately do something that will cause an error
declare @i int = 'abc';
return 0; -- by pure convention, a return value of 0 means no error.
end try begin catch
print error_message();
return error_number(); -- will be 245 because that's the error number of a conversion failure
end catch
end
go
-- prints:
-- Conversion failed when converting the varchar value 'abc' to data type int.
-- return value was 245
declare @returnvalue int;
exec @returnvalue = p;
print concat('return value was ', @returnvalue);
go
2条答案
按热度按时间yhqotfr81#
存储过程的“返回值”就是使用
return
声明。如果你没有明确的return
语句,则该过程将返回值0。让我们看一些例子。在第一个例子中,我使用了一个显式的return语句。我告诉程序返回值
1000
:这次我把return语句注解掉了。该过程将返回默认值0:
我们可以随意使用返回值,但按照惯例,返回值用于提供有关过程成功或失败的信息。您可以使用它来返回“数据”,但为此您应该使用输出参数。
在下面的示例中,您可以看到一个非常标准的模式。如果不出差错,我们就把事情搞清楚了
try
拦住,然后击中return 0
声明。为什么是零?这只是一个可以追溯到几十年前的惯例,这意味着“没有什么错,没有什么有意义的错误可以报告”。但是在下面的代码中,我故意做了一些会导致错误的事情。这意味着我们无法到达
return 0
最后的陈述try
阻止。相反,执行将跳转到
catch
阻止。内部catch
块i返回error_number()
与我故意造成的错误有关。idv4meu82#
我认为您需要重新访问您编写的存储过程逻辑。你必须非常清楚你要回来的是什么。
以下是一些最佳实践:
使用return仅返回过程执行的执行状态。除过程执行状态外,不返回任何值。
要从过程返回标量值,请使用输出参数
要从过程返回多个值/结果集,请使用select语句。