sql-server - 为什么我应该使用带有输出参数的存储过程
问题描述
不带输出参数的存储过程:
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
解决方案
正确的执行方式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 ,这有点麻烦。
结论:这取决于你的实际情况。
推荐阅读
- swift - 如何在 SwiftUI 中从详细视图编辑列表视图
- python - Webscraping 返回变量而不是实际值
- javascript - 通过 onClick 在 React.js 中删除一个段落?
- flutter - 如何在颤动的文本字段中的前导图标和文本之间添加分隔符
- sql - 查询以获取 table1 中每一行的结果,其中包含满足 table2 中条件的 N 最大记录的子查询
- sql - 相同的where子句中的Between和Like
- swift - 是否可以在 Swift 的 if 条件中使用字符串变量?
- arrays - 减少值相等的数组
- python - 如何使用 for 循环一一“填充”子图?
- c# - sql to Linq union 是通过引用吗?(除了和相交一样吗?)