我知道如何编写带有输出参数的存储过程。但我不知道为什么我会使用它而不是仅仅使用一个简单的SELECT
语句。一个普通的存储过程仍然可以在一个网格中返回一个输出(见下面的例子)。
任何人都可以举一个真实的例子,我可以使用带输出参数的 SP 和不带输出参数的 SP 吗?
例子
-- Using output parameter
SELECT @var = COUNT(*) FROM table1 WHERE gender = @gender...
-- Without output parameter
SELECT COUNT(*) FROM table WHERE gender = @gender...
存储过程中的输出参数对于将值传递回调用 T-SQL 很有用,然后调用 T-SQL 可以将该值用于其他事情。
假设您有一个存储过程,它返回给定城市输入的状态,状态作为输出参数:
您现在可以使用此输出参数在别处传递一个值。
例如:
总而言之,如果您只想为客户端应用程序返回一个值,您可能不需要输出参数。
但是,如果您想在 T-SQL 中的存储过程之间传递值,它们会非常有用。
对于它的价值,我几乎不使用输出参数。
假设这个问题与 SQL Server 有关:它归结为上下文和效率。
上下文 = 应用程序代码
从应用程序代码执行存储过程时,在代码量方面并没有太大区别。返回结果集时,只需调用
ExecuteReader
thenSqlDataReader.Read()
获取一行,然后从SqlDataReader
.ExecuteScalar
但是,如果您只是获取单个值,那么您可以使用获取一行(即使有更多行)并返回第一列中的值(即使有更多列)的快捷方法。返回OUTPUT
参数时,只需要调用ExecuteNonQuery
,检查.Value
每个参数的属性,并转换为合适的类型。因此,就返回单个值的简单示例而言,返回结果集并调用
ExecuteScalar
. 但是,返回结果集,无论是使用ExecuteReader
还是ExecuteScalar
,都需要 SQL Server 和客户端应用程序的更多资源。SQL Server 需要设置和管理结果集(即需要内存和时间),应用程序需要实例化 aSqlDataReader
(是的,即使使用ExecuteScalar
)并管理它(即需要内存和时间)。如果保证您只有一个结果集行,那么最好使用输出参数(即使只有一点点)。上下文 = T-SQL
OUTPUT
当从 T-SQL 执行存储过程(并且需要使用返回值)时,使用参数至少更方便。返回结果集是可用的,但需要使用INSERT ... EXEC
. 但是您仍然需要将行选择为局部变量。同样,需要更多的时间和资源来获得变量中的值。现在,当您只返回一个值(即适用于 的相同情况)时,有时
ExecuteScalar
您可以使用标量用户定义函数 (UDF),它能够放入查询中,这有时非常有用(即使在查询中使用标量 UDF 会降低性能)。但是,在 UDF 中可以执行的操作有很多限制,因此如果您需要创建临时表,或者执行任何 DML 或 DDL 等,那么使用存储过程是唯一的选择。虽然不是“结果集与输出参数”问题的一部分,但请记住,您可以同时做这两个问题!如果您有一些谨慎的值以及要返回的一组数据,存储过程确实允许返回两者,这在极少数情况下非常有用。
我认为还有两件事值得注意:
1) 您可以传递多个参数为
OUTPUT
,OUTPUT
2)如果您不想要结果,则不必调用参数调用此例程:
返回 NULL、NULL、NULL
返回 13, "A 的值为 2,B 的值为 13", 0
返回 13, "A 的值为 2,B 的值为 13", 0
(和上次调用一样,因为我们没有通过 using 获取新值
OUTPUT
,所以它保留了旧值。)返回 16, "A 的值为 5,B 的值为 16", 1