2011-03-04 94 views
69

我感到困惑的几个要点:存储过程和视图之间有什么区别?

  1. 是什么一个存储过程,视图之间的区别?

  2. 什么时候应该使用存储过程,以及何时应该在SQL Server中使用视图?

  3. 视图允许创建动态查询,我们可以传递参数吗?

  4. 哪一个是最快的,基于哪一个比另一个更快?

  5. 视图或存储过程是否永久分配内存?

  6. 如果有人说视图创建了一个虚拟表,而程序创建了一个材料表,那么这是什么意思?

请让我知道更多的积分,如果有的话。

回答

77

一个视图代表一个虚拟表。您可以在视图中连接多个表,并使用该视图呈现数据,就好像数据来自单个表一样。

存储过程使用参数来执行函数...无论是更新和插入数据还是返回单个值或数据集。

Creating Views and Stored Procedures - 从Microsoft获得一些信息,说明何时以及为什么要使用它们。

说我有两个表:

tbl_user 列: .user_id, .user_name, .user_pw

tbl_profile 列: .profile_id, .user_id .profile_description

所以,如果我发现自己从这些表ALOT查询...而不是做每一个SQL的联接我会定义一个鉴于这样的:

CREATE View vw_user_profile 
AS 
    Select A.user_id, B.profile_description 
    FROM tbl_user A left join tbl_profile B on A.user_id = b.user_id 
GO 

因此,在未来,如果我想通过用户ID查询profile_description ......所有我需要做的就是

SELECT profile_description FROM vw_user_profile WHERE user_id = @ID 

的代码可以在存储过程中使用,如:

create procedure dbo.getDesc 
@ID int 
AS 
begin 
SELECT profile_description FROM vw_user_profile WHERE user_id = @ID 
END 
GO 

所以后来我可以叫

dbo.getDesc 25 

,我将得到用户标识为25的描述。其中25是你的参数。

显然有很多细节,但这只是基本的想法。

+0

但我可以加入可以加入存储过程中的多个表以及我不必提供参数。 – NoviceToDotNet 2011-03-04 14:31:02

+2

但为什么你会这样做?你想达到什么目的?你可以使用一个视图作为表...存储过程是为了做事...视图是为了让你的生活更轻松。 – Patrick 2011-03-04 14:31:46

+0

将视图看作存储的查询,所以如果您有两张表,您发现必须加入很多工作才能完成工作,则可以创建一个工作视图,以便您不必一直加入它们。 – Patrick 2011-03-04 14:33:27

3

SQL View是一个基于SQL SELECT查询的虚拟表。一个视图引用一个或多个现有的数据库表或其他视图。它是数据库的快照,而存储过程是一组编译为单个执行计划的Transact-SQL语句。

查看很简单地展示存储在数据库表中的数据,而存储过程是一组可执行的语句。

视图更快,因为它显示引用的表中的数据,而存储过程执行sql语句。

选中这篇文章:View vs Stored Procedures。你正在寻找什么

5

首先你需要了解两者是不同的东西。存储过程最适用于INSERT-UPDATE-DELETE语句。和Views用于SELECT语句。你应该使用两者。

在视图中,您无法更改数据。

54

大量信息的网页

http://bytes.com/topic/sql-server/answers/450173-views-vs-stored-procedures-whats-difference

这里就可以是一个很好的总结:

存储过程:

  • 接受参数
  • 不能被用作更大查询中的积木块
  • 可以包含多个语句,循环,IF ELSE等
  • 可以进行修改,以一个或多个表
  • 不能被用作插入,更新目标或DELETE 语句。

视图:

  • 不接受参数
  • 可用作在更大的查询构件块
  • 只能包含一个单一的SELECT查询
  • 不能执行修改任何表
  • 但可以(有时)用作INSERT,UPDATE或 DELETE语句的目标。
+1

+1列举主要差异。 – 2013-10-07 23:33:21

+1

其他视图不应该包含任何“按顺序排列”或“顶部”子句 – sksallaj 2016-03-31 16:34:50

1

@Patrick与他所说的是正确的,但要回答您的其他问题,视图将在内存中创建自己,并根据联接类型,数据以及是否有任何聚合完成,它可能是相当内存饥饿的看法。

存储过程使用Temp Hash Table例如#tmpTable1或使用@ tmpTable1在内存中执行所有处理。取决于你想告诉它做什么。

存储过程就像一个函数,但直接由其名称调用。而不是在查询本身中实际使用的函数。

显然大部分时间内存表速度更快,如果你没有检索大量的数据。

3
  1. 的图是一个动态查询这里可以用一个“WHERE” -Clause
  2. 存储过程是一个固定的数据选择,它返回一个预定义的结果
  3. 也不的图,也不存储过程分配内存。只有物化视图
  4. 的表只是一个实体,一个视图可以收集来自不同的实体或表格
4

数据视图是一个简单的方法来拯救一个复杂的SELECT在数据库中。

当简单SQL不够时,使用存储过程。存储过程包含变量,循环和调用其他存储过程。这是一种编程语言,而不是查询语言。

  1. 视图是静态的。将它们视为具有特定布局的新表格,并使用您创建的查询来即时创建它们中的数据。与任何SQL表一样,您可以使用WHEREGROUP BYORDER BY对其进行排序和过滤。

  2. 这取决于你做什么。

  3. 这取决于数据库。简单的视图只是运行查询并过滤结果。但是像Oracle这样的数据库允许创建一个“物化”视图,这个视图基本上是一个当视图底层数据发生变化时自动更新的表格。

    物化视图允许您在视图的列上创建索引(特别是在数据库中任何位置不存在的计算列上)。

  4. 我不明白你在说什么。

3

主要区别在于,当您查询视图时,它的定义会粘贴到您的查询中。程序也可以给出查询结果,但是它已经被编译并且速度更快。另一个选项是索引视图..

5

视图:它们是由来自数据库的不同实际表格的一个或多个行和列组成的虚拟表。它是多个表格的行和列的模板。你不能在这里传递任何参数。

存储过程:它们是预执行的sql语句的集合,您可以将参数作为输入发送并检索输出数据。

视图可以在存储过程中使用,但存储过程不能在视图中使用...!

1

当他建议你不能改变视图中的数据时,Mahesh不太正确。所以帕特里克的看法

CREATE View vw_user_profile AS 
Select A.user_id, B.profile_description 
FROM tbl_user A left join tbl_profile B on A.user_id = b.user_id 

我可以更新数据...作为一个例子,我可以做任何一个这些......

Update vw_user_profile Set profile_description='Manager' where user_id=4 

Update tbl_profile Set profile_description='Manager' where user_id=4 

不能插入这种看法,因为不是所有的字段中的所有表都存在,我假设PROFILE_ID是主键,可以” t为NULL。 但是有时你可以插入到一个视图...

我创建了使用现有表的视图...

Create View Junk as SELECT * from [TableName] 

THEN

Insert into junk (Code,name) values 
('glyn','Glyn Roberts'), 
('Mary','Maryann Roberts') 

DELETE from Junk Where ID>4 

INSERT和DELETE都在这种情况下工作

显然你不能更新任何聚合或计算的字段,但任何只是直观的视图都应该是可更新的。

如果视图包含多个表格,则不能插入或删除,但如果视图只是一个表格的子集,那么通常情况下可以。

0

除了上面的评论,我想补充几点关于Views。

  1. 视图可以用来隐藏复杂性。设想一个场景,其中有5个人在进行一个项目,但只有其中一个对于复杂联接等数据库内容太好。在这种情况下,他可以创建视图,在查询任何单个表时,可以由其他团队成员轻松查询。
  2. 安全性可以通过视图轻松实现。假设我们的表雇员它包含敏感列如薪水,SSN号码。对于无权查看它们的用户,这些列不应该是可见的。在这种情况下,我们可以创建一个视图,选择不需要任何授权的表中的列,如名称,年龄等,而不暴露敏感列(如我们前面提到的Salary等)。现在我们可以删除直接查询员工的权限,只保留View的读取权限。通过这种方式,我们可以使用Views实现安全性。
相关问题