【问题标题】:When to use function and when to use stored procedure in SQL Server [duplicate]在 SQL Server 中何时使用函数以及何时使用存储过程 [重复]
【发布时间】:2016-03-21 19:53:01
【问题描述】:

在 SQL Server 中何时使用函数以及何时使用存储过程?

我想知道人们对此的想法和经验。另外,想知道何时使用视图。我不是在寻找这些 db 对象的定义。一个实际的场景讨论会很好

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    在我看来,仅仅使用 SP 来读取数据是一个非常糟糕的习惯。

    你必须区分

    • SP:批处理,通常是多语句,您可以(几乎)执行所有操作。最大的缺陷是,您无法轻松地继续使用 SP 结果,并且 - 如果您想在进一步的查询中使用 SP 返回 - 您总是必须将其写入正确声明的表(真实、临时或变量)中。这可能是很多容易出错的类型。此外,优化器将无法高效地处理此问题。

    • TV-UDF(表值用户定义函数):必须注意存在两种风格的事实:单语句(ad-hoc)或多语句。第一个很好,第二个(几乎在所有情况下)非常糟糕!与 VIEW 相比的一个优势是,参数及其处理是预编译的。

    • VIEW:这与 ad-hoc TV-UDF 一样好。您可以使用模式绑定来声明它,并且几乎就像它是一个表(索引等)一样处理它......

    Fazit:将 SP 用于 UPDATE、DELETE、任何类型的数据或结构操作,但用于单独阅读。

    【讨论】:

    • 为什么使用SP读取数据是一个非常不好的习惯?
    • 正如我在回答中所写的,最大的缺陷是在执行 之后使用了结果集。 TV-UDF 的返回可以像SELECT * FROM dbo.MyFunction(@prm1,@prm2) 一样简单地使用,也可以直接在 JOIN 或 APPLY 中使用。这将永远适用于 SP。其次,内联调用的性能总是更好。当 SP 适合读取数据时,有 非常 罕见的情况(例如,您必须使用动态 SQL)。
    • 明白。我对此有不同的感觉。当多个应用程序(C#、Java 等)进行调用以在本地检索信息和处理信息时,我很欣赏使用通用 SP 检索数据而不是应用程序编写参数化 SQL 语句。 SP 中基于游标的复杂业务逻辑也帮助了我。所以我的感觉是通过 SP 的 CRUD 有它的位置; UDF,正如你所说的,也有它的位置。
    • @zedfoxus 光标也非常很糟糕,应尽可能避免使用。它们——几乎在所有情况下——都不需要。阅读“基于行”和“基于集合”的思维。并且:没有理由使用“参数化 SQL 语句”进行查询。预编译的 TV-UDF 和 SP 一样帅。
    • 很酷,我们有不同的意见
    【解决方案2】:

    例如在我的日常工作中,我使用 sp 来检索、存储、更新和删除记录,我大部分时间都是从 web 应用程序中执行这些 sps,但有时当某些 sp 需要一些复杂或重复的操作时,我会使用如果需要,函数可以重用该操作,或者在我的 sp.js 中留下更干净的代码。

    我们通常不使用视图,但为了简单起见,您可以使用它们,如果您只是调用视图,则不需要使用连接进行相同的长选择命令。

    这是我的经验,对不起我的英语:)。

    【讨论】:

      猜你喜欢
      • 2013-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2016-01-14
      相关资源
      最近更新 更多