【发布时间】:2016-03-21 19:53:01
【问题描述】:
在 SQL Server 中何时使用函数以及何时使用存储过程?
我想知道人们对此的想法和经验。另外,想知道何时使用视图。我不是在寻找这些 db 对象的定义。一个实际的场景讨论会很好
【问题讨论】:
标签: sql sql-server
在 SQL Server 中何时使用函数以及何时使用存储过程?
我想知道人们对此的想法和经验。另外,想知道何时使用视图。我不是在寻找这些 db 对象的定义。一个实际的场景讨论会很好
【问题讨论】:
标签: sql sql-server
在我看来,仅仅使用 SP 来读取数据是一个非常糟糕的习惯。
你必须区分
SP:批处理,通常是多语句,您可以(几乎)执行所有操作。最大的缺陷是,您无法轻松地继续使用 SP 结果,并且 - 如果您想在进一步的查询中使用 SP 返回 - 您总是必须将其写入正确声明的表(真实、临时或变量)中。这可能是很多容易出错的类型。此外,优化器将无法高效地处理此问题。
TV-UDF(表值用户定义函数):必须注意存在两种风格的事实:单语句(ad-hoc)或多语句。第一个很好,第二个(几乎在所有情况下)非常糟糕!与 VIEW 相比的一个优势是,参数及其处理是预编译的。
VIEW:这与 ad-hoc TV-UDF 一样好。您可以使用模式绑定来声明它,并且几乎就像它是一个表(索引等)一样处理它......
Fazit:将 SP 用于 UPDATE、DELETE、任何类型的数据或结构操作,但不用于单独阅读。
【讨论】:
SELECT * FROM dbo.MyFunction(@prm1,@prm2) 一样简单地使用,也可以直接在 JOIN 或 APPLY 中使用。这将永远适用于 SP。其次,内联调用的性能总是更好。当 SP 适合读取数据时,有 非常 罕见的情况(例如,您必须使用动态 SQL)。
例如在我的日常工作中,我使用 sp 来检索、存储、更新和删除记录,我大部分时间都是从 web 应用程序中执行这些 sps,但有时当某些 sp 需要一些复杂或重复的操作时,我会使用如果需要,函数可以重用该操作,或者在我的 sp.js 中留下更干净的代码。
我们通常不使用视图,但为了简单起见,您可以使用它们,如果您只是调用视图,则不需要使用连接进行相同的长选择命令。
这是我的经验,对不起我的英语:)。
【讨论】: