存储过程和视图之间有什么区别?

时间:2011-03-04 14:26:39

标签: sql sql-server-2005 stored-procedures views

我对以下几点感到困惑:

  1. 存储过程与视图有什么区别?

  2. 我应该何时使用存储过程,何时应该在SQL Server中使用视图?

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

  4. 哪一个最快,哪个比另一个快?

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

  6. 如果有人说视图会创建虚拟表格,而程序会创建材料表格,这意味着什么?

  7. 请告诉我更多要点,如果有的话。

10 个答案:

答案 0 :(得分:108)

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

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

Creating Views and Stored Procedures - 有一些来自Microsoft的信息,说明何时以及为何使用每种信息。

说我有两张桌子:

tbl_user  列:    。用户身份,    。用户名,    .user_pw

tbl_profile  列:    .profile_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

我会得到用户ID 25的描述。其中25是你的参数。

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

答案 1 :(得分:75)

网上有大量信息,例如this

以下是一个很好的总结:

存储过程:

  • 接受参数
  • 可以在较大的查询中用作构建块
  • 可以包含多个语句,循环,IF ELSE等。
  • 可以对一个或多个表执行修改
  • 不能用作INSERT,UPDATE或DELETE的目标 声明。

观点:

  • 不接受参数
  • 可用作更大查询中的构建块
  • 只能包含一个SELECT查询
  • 无法对任何表格进行修改
  • 但可以(有时)用作INSERT,UPDATE或的目标 DELETE语句。

答案 2 :(得分:9)

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

在视图中,您无法更改数据。某些数据库具有可更新的视图,您可以在视图上使用INSERT-UPDATE-DELETE。

答案 3 :(得分:5)

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

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

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

查看此文章:View vs Stored Procedures。正是你在寻找什么

答案 4 :(得分:5)

视图是在数据库中保存复杂SELECT的简单方法。

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

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

  2. 取决于你的工作。

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

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

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

答案 5 :(得分:3)

  1. VIEW是一个动态查询,您可以使用“WHERE”-Clause
  2. 存储过程是固定数据选择,它返回预定义结果
  3. 视图和存储过程也不分配内存。只有物化视图
  4. TABLE只是一个ENTITY,一个视图可以从不同的ENTITIES或TABLES收集数据

答案 6 :(得分:3)

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

答案 7 :(得分:2)

当他建议你不能改变视图中的数据时,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是主键且不能为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都适用于这种情况

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

如果视图包含多个表,则无法插入或删除,但如果视图只是一个表的子集,则通常可以。

答案 8 :(得分:1)

@Patrick与他所说的是正确的,但是为了回答你的其他问题,View会在内存中创建自己,并且根据联接的类型,数据以及是否有任何聚合完成,它可能是一个非常记忆的内存图。

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

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

显然,如果您没有检索到大量数据,大多数情况下内存表会更快。

答案 9 :(得分:1)

除了上述评论之外,我想补充一些关于观点的观点。

  1. 视图可用于隐藏复杂性。想象一下这样一个场景,其中5个人正在处理一个项目,但只有其中一个人对数据库之类的东西如复杂的连接太好了。在这种情况下,他可以创建视图,其他团队成员可以在查询任何单个表时轻松查询这些视图。
  2. 视图可以轻松实现安全性。假设我们的表员工包含敏感列,例如薪水 SSN号码。对于无权查看这些列的用户,这些列不应该是可见的。在这种情况下,我们可以创建一个视图,选择表格中的列,不需要任何授权,如名称年龄等,而不会暴露敏感列(如工资等)我们之前提到的)。现在我们可以删除直接查询表员工的权限,并保留对View的读取权限。通过这种方式,我们可以使用Views实现安全性。