【问题标题】:Returning a value from a Stored proc as an Output parameter vs a SELECT statement从存储过程中返回一个值作为输出参数与 SELECT 语句
【发布时间】:2011-01-04 12:21:25
【问题描述】:

一个非常愚蠢的例子,但如果我需要从订单表中获取最大订单 ID,我有两个选项(我知道还有更多,但我只对这两个感兴趣)。我很想知道哪个最终会减少开销。

第一个简单地选择值的方法:

CREATE PROCEDURE GetLastOrderID
AS
SELECT Max(OrderID) FROM Orders

然后相应的C#代码创建一个SQLCommand来执行proc,调用.ExecuteScalar,并将值转换为一个int。

第二个将值作为输出参数传递出去

CREATE PROCEDURE GetLastOrderID (@MaxOrderID INT OUTPUT)
AS
SET @MaxOrderId = Max(OrderID) FROM Orders

然后对应的C#代码创建一个SQLCommand来执行proc,添加一个int类型的输出参数,然后调用.ExecuteNonQuery,最后得到输出参数的值。

两者之间有什么真正的好处吗?我的直觉是,第一个选项将花费更多时间/资源,因为没有给出明确的类型,但我很想知道是否有明确的答案。 (或者至少在权威方面胜过我的“直觉”)

【问题讨论】:

  • OPUTPUT 参数意味着比构造和返回记录集更轻量级。我不知道多少。通过创建 2 个版本并循环调用它们应该很容易自己测试。
  • @Martin :它们更轻,但除非您多次调用,否则差异很小。

标签: c# .net tsql


【解决方案1】:

没有。

与在除少量行数之外的任何内容上实际运行 TSQL MAX() 语句相比,您所指的开销可以忽略不计。

使用最容易理解和最容易维护的形式。

当您发现性能问题时担心性能。

【讨论】:

  • 请记住,这是一个“愚蠢”的例子。你还没有真正回答这个问题,只是说这个特定的例子可以忽略不计,所以没关系。也许更好的例子是将一个值插入一个表并取回新行的 ID?
  • @Paul Sainsbury:只有提出示例的人才能控制示例! ;)
  • @Paul:我不觉得这是一个愚蠢的例子。我希望我自己问过这个问题。
  • 我不同意“当您发现性能问题时担心性能。” AFAIK OUTPUT 参数会更有效,所以为什么不预先建立它,然后默认使用最有效的方式。
  • @Martin:因为这是一个微优化,经验和我家男孩 Knuth 这么说的!
【解决方案2】:

输出参数更轻。

【讨论】:

    猜你喜欢
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多