存储过程,何时使用输出参数vs返回变量

时间:2010-09-28 17:38:52

标签: sql

何时使用输出参数vs返回变量,反之亦然?在下面的简单示例中,我可以使用任何一个实现相同的功能。

使用输出参数

create proc dbo.TestOutput (@InValue int, @OutValue int output)
as
set @OutValue = @InValue

declare @x int
exec TestOutput @InValue = 3, @OutValue = @x output
select @x 

使用返回变量:

create proc dbo.TestReturn (@InValue int)
as
return @InValue

declare @x int
exec @x = TestReturn @InValue = 3
select @x 

正如你所看到的,他们都做同样的事情。有人能告诉我一个例子,输出参数与返回变量的选择会产生什么影响吗?

7 个答案:

答案 0 :(得分:15)

我更喜欢:

当您只需要返回一个项目时使用返回值。

当您需要返回多个值时使用输出参数。

另一种常见的使用模式,虽然不是我的偏好,但是只使用返回值来告知成功或失败以及需要返回的任何内容的输出参数。

答案 1 :(得分:11)

这是T-SQL,而不是C.永远不要使用返回值,许多客户端API使得处理返回值变得很痛苦,如果不是根本不可能的话。始终使用OUTPUT参数。

答案 2 :(得分:9)

您应该使用RETURN从过程返回一个值,就像使用EXIT返回批处理脚本中的值一样。返回不是真正用于参数传递,而是作为退出过程或查询的方法。根据{{​​3}}:

  

除非另有说明,否则所有系统存储过程都返回值0.这表示成功,非零值表示失败。

一旦您意识到缺乏为返回值定义类型的能力,这一点就会变得更加明显。它必须是INT。

答案 3 :(得分:8)

由于返回值仅适用于int,因此最终会出现“不一致”。我更喜欢输出参数的一致性。

此外,输出参数强制调用者识别返回的值。 IME,返回值通常被忽略。

答案 4 :(得分:1)

我将以不同的方式回答这个问题:

如果您想返回一个值,则可以选择两个选项。但是如果你想返回多个值,你只需要坚持输出参数。

第二种场景:在C#中,如果使用输出参数,则可以控制类型。

第三种情况:功能与程序选择适合您需求的那种。

希望这有帮助

答案 5 :(得分:1)

取自here

  • 如果要返回一个或多个具有数据类型的项目,则最好使用输出参数。
  • 通常,对需要返回的任何内容使用输出参数。
  • 如果只想返回一个只有整数数据类型的项目,那么最好使用返回值。
  • 通常,返回值仅用于通知存储过程成功或失败。
  • 返回List项目值为0表示成功,任何非零值表示失败。

答案 6 :(得分:0)

我将返回值用于很多事情,因为它更具表现力,例如:

1 - 当我在数据库中进行验证时插入或更改项目返回正数以返回标识,使用错误编号返回负数,它更快。

2-当我预约分页时,使用它来返回记录的总量也更快,成本更低。 对于其余的我在有多个返回或不同类型的int时使用Output。当然,我使用recorset返回项目列表

如何使用Dapper进行查询我没有受到影响。