【问题标题】:What is better to return single value from stored procedure to .Net: OUTPUT parameter or ExecuteScalar?将存储过程中的单个值返回到 .Net:OUTPUT 参数还是 ExecuteScalar 哪个更好?
【发布时间】:2011-12-21 12:27:12
【问题描述】:

我需要创建一个需要返回一些记录计数的存储过程。我正在使用 .Net 来读取结果。

我可以使用OUTPUT 参数返回值或者我可以在存储过程中执行select count(*) 并使用SqlCommand.ExecuteScalar 来读取它。

什么更好,为什么?

【问题讨论】:

  • 或者您可以使用RETURN 参数,如您所问:stackoverflow.com/questions/8587814/…
  • 您需要创建一个存储过程,但您问是否应该编写一个存储过程。你应该做你应该做的。
  • @Oded 好吧...答案实际上是 RETURN 不应该用于错误信号以外的任何事情。
  • 我的意思是@gbn 在他的回答中似乎也回答了这个问题。
  • @Oded 关于标量的声明可能不正确 (blogs.x2line.com/al/archive/2007/05/01/3049.aspx),并且除了限于 outputreturn 的问题之外。

标签: c# .net sql sql-server tsql


【解决方案1】:

查看这篇 MSDN 文章:Performance Comparison: Data Access Techniques

文章在GetOrderStatus 的性能测试中显示,OUTPUT 参数和 ExecuteScaler 之间的性能对于检索单个值是相同的,但 ExecuteScalar 需要的代码更少。

以下是关于不使用 OUTPUT 参数的其他一些有趣的想法: What's wrong with output parameters。我喜欢那篇帖子中Output params break the fundamental idea of a function 的想法。

【讨论】:

  • 我同意 C# 域,但 SQL 域有点不同,因为在许多情况下,我们喜欢优化事物的传输方式并限制开销。
  • +1 用于性能测试链接。 Interesting Graph
  • 旧文章,但现在可能更相关。随着客户端、网络和服务器规格大大提高,技术的选择可能并不重要。正如我在那里评论的那样,存储过程不是一个函数(我也回答了)
  • 使用标量非常好,直到您需要在另一个 T-SQL 脚本中获取结果,然后它变得有点痛苦,特别是如果您的 SP 也返回一个值。
【解决方案2】:

绝对 - OUTPUT 参数是最快最正确的方式

【讨论】:

  • 你有一些文件来支持这个声明吗?
  • 是的,ExecuteScalar 创建了 TDS,这比将 OUTPUT 参数传回(它的单词“fastest”)是相对繁重的操作。建议使用 RETURN 仅返回执行的错误状态(这是用于单词“最正确的”)。如果你需要证据,我会找到一个
  • @OlegDok - 我听说OUTPUT 参数的重量也更轻,但我不确定在实践中是否有多少好处。看看两者的 TDS 数据包结构会很有趣。
  • 还有一点——参数可以强类型——我觉得这也是一个好处。
  • @OlegDok - TDS 只是与客户端通信的协议名称。他们将如何传递价值?
【解决方案3】:

添加一个想法 - 如果 SP 没有另外提及,ExecuteScalar 将返回状态代码。保留它似乎是个好习惯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多