使用SQL视图与等效存储过程有什么好处?

时间:2011-05-04 18:56:09

标签: sql tsql stored-procedures views

在我的头脑中,我知道视图与存储过程的一个主要缺点。如果存储过程A引用存储过程B和B发生更改,则A将正常工作。但是,如果视图A引用视图B和B发生更改,则需要更新A才能正常工作。恕我直言,这种观点行为只是糟透了,并打开了各种微妙错误的大门。

嗯,那么优势怎么样?为什么人们总是使用视图,如果他们可以总是使用名称前缀为vw的等效存储过程来保持清晰度呢?

4 个答案:

答案 0 :(得分:7)

您无法在不传入参数的情况下过滤存储过程。在视图中,您可以像查询表一样查询它,根据需要添加任何where子句。

答案 1 :(得分:2)

SQL视图用于很多其他目的。

1)隐藏原始表中的几列,并为特定用户组创建视图分配权限。我想这是视图的一个主要用途。

2)合并2个或更多表,有一个派生列

3)索引视图,与普通视图不同,具有分配的内存,而普通视图的执行计划显示主表的使用情况。因此,您可以实际使用索引视图,而无需引用主表。

答案 2 :(得分:1)

如果它是“select * from vwMyView”和“exec MyProc()”之间的选择,那就没有太大区别。两者都将返回您可以使用的结果集。需要注意的一点是,如果您使用视图,它可以连接到其他表,这可能适用于您的情况,也可能不适用。

如果你想/需要过滤结果集,你会想要使用一个视图,因为它很容易添加一个where子句,其中,使用proc,你需要传入参数。

如果您希望/需要使用现有的proc作为源的一部分,则需要使用存储过程,因为视图无法引用存储过程。

你提到的“细微错误”可能会出现在任何一种方法中。如果您有视图A参考视图B,并且实现视图B的查询发生更改(不更改返回的列数),则依赖于视图A的任何内容都可能会中断。存储过程也是如此:如果proc B更改其结果集的创建方式,则proc A可能无法再正常工作。

通常,当您具有视图引用视图和procs引用过程时,您需要小心。除了上述问题,您还可以介绍一些非常严重的性能问题。

答案 3 :(得分:0)

从我的观点来看,有两个主要议题:

  1. 存储过程的缓存计划 - 这将有利于SP的执行,但如果视图执行时,其计划也将以现金形式存在。

  2. 视图可以在JOINs中使用,但SP无法完成。