带有返回参数的SP定义
if OBJECT_ID('CountSeatleEmployee') is not null
drop proc CountSeatleEmployee
go
CREATE PROC CountSeatleEmployee
AS
DECLARE @Total int
SELECT @Total =Count(*)
from [AdventureWorks2012].[Person].[Person] P
WHERE P.EMAILPROMOTION =0
RETURN @Total
--Execute SP
declare @Count int
exec @Count = CountSeatleEmployee
SELECT @COUNT
--11158 Records
--same SP without Return Parameter
if OBJECT_ID('CountSeatleEmployee') is not null
drop proc CountSeatleEmployee
go
CREATE PROC CountSeatleEmployee
AS
SELECT Count(*)
from [AdventureWorks2012].[Person].[Person] P
WHERE P.EMAILPROMOTION =0
exec CountSeatleEmployee'
现在为什么不简单地使用下面。这两个提供相同的输出。为什么我们播种返回参数
答案 0 :(得分:1)
根据我的经验,返回值通常用于错误条件。不是每个人都有相同的经历。
RETURN语句仅限于返回一个整数,因此它的用处有限(在我看来)。我更喜欢第二种方法,因为它允许代码更加一致。想象一下,你想要一个名字而不是一个计数,你将无法使用return语句。
另一方面,有些人更喜欢第一种使用return语句的方法(只要有可能就这样做)。理由是它是一种优化技术。当您从前端调用第一个代码示例时,无需处理该过程,期望它将返回结果集。相反,它只是从数据库传回的单个4字节值。第二个示例需要在前端进行更多处理,因为过程可以返回各种事物。它可以返回多个结果集,每个结果集可以包含多个列和多个行。您的前端代码需要评估返回的数据,然后构建适当的结构来处理数据。这需要额外的CPU周期。
我不一定推荐一个,我只是想解释一下这个理由。
答案 1 :(得分:0)
单向提供返回变量中的信息,然后使用Select of the variable将另一个转换为记录集,另一个作为数据集或记录集。这取决于您要使用的应用程序。
if OBJECT_ID('CountSeatleEmployee') is not null
drop proc CountSeatleEmployee
go
CREATE PROC CountSeatleEmployee
AS
DECLARE @Total int
SELECT @Total =Count(*)
from [AdventureWorks2012].[Person].[Person] P
WHERE P.EMAILPROMOTION =0
Select * from [AdventureWorks2012].[Person].[Person] P
WHERE P.EMAILPROMOTION =0
RETURN @Total
--Execute SP
declare @Count int
exec @Count = CountSeatleEmployee --This will return the recordset of the table and returns the total rows into the variable @Count
SELECT @COUNT