首页 > 解决方案 > 为什么我应该使用带有输出参数的存储过程

问题描述

不带输出参数的存储过程:

CREATE PROCEDURE Getstudentname
    (@studentid INT   -- Input parameter, Studentid of the student
    )
AS
BEGIN
    SELECT Firstname + ' ' + Lastname 
    FROM tbl_Students 
    WHERE studentid = @studentid
END

我执行了上面的存储过程:

exec Getstudentname 2

结果是:Pankaj Kumar

其中作为带有输出参数的存储过程:

CREATE PROCEDURE GetstudentnameInOutputVariable
    (@studentid INT,                 -- Input parameter, Studentid of the student
     @studentname VARCHAR(200) OUT   -- Out parameter declared with the help of OUT keyword
    )
AS
BEGIN
    SELECT @studentname = Firstname + ' ' + Lastname 
    FROM tbl_Students 
    WHERE studentid = @studentid
END

我执行了这个存储过程:

DECLARE @return_value int

EXEC @return_value = [dbo].[Getstudentname]
                           @studentid = 2

SELECT 'Return Value' = @return_value

GO

结果是:Pankaj Kumar

标签: sql-servertsqlstored-procedures

解决方案


正确的执行方式GetstudentnameInOutputVariable

DECLARE @return_value VARCHAR(200)

EXEC  [dbo].[Getstudentname] 2,@return_value OUTPUT

SELECT 'Return Value' = @return_value

GO

您可以使用OUTPUT参数的场景可能很少,您的示例似乎不是其中之一。

当您的 proc 返回一个通常指示 Flag 的值时。

就像你的例子一样,

SELECT @studentname = Firstname + ' ' + Lastname FROM tbl_Students

我可能需要从中选择几列tbl_Students,所以output列并不理想。

假设我有一个执行 DML 操作的 proc,并且在前端应用程序中,c# 我只想标记知道给定的 proc 是否成功执行或某些验证失败或某些错误,我只需要知道Pass/Fail标记并将根据标记进行工作。

当你这样做时,DML operation才是ExecuteNonQuery最好的选择。 Output paramter最好与EXecuteNonQuery.

所以你应该Output parameter在这种情况下使用。

另一种情况是当您执行一个 proc 并需要该 proc 的 1 或 2 个结果来调用 proc 时。

那么这是非常方便的方式。

您也可以返回结果集,但要捕获结果集,您需要创建 temp ,这有点麻烦。

结论:这取决于你的实际情况。


推荐阅读