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


137

我对以下几点感到困惑:

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

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

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

  4. 哪一个最快,在什么基础上比另一个快?

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

  6. 如果有人说视图创建虚拟表,而过程创建物料表,那又意味着什么呢?

如果有任何其他问题,请让我知道。

Answers:


143

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

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

创建视图和存储过程 -Microsoft提供了一些有关何时以及为何使用它们的信息。

说我有两个表:

  • tbl_user与列:user_iduser_nameuser_pw
  • tbl_profile与列:profile_iduser_idprofile_description

因此,如果我发现自己从那些表中查询很多...而不是在每条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

因此,如果我想查询profile_descriptionuser_id在将来,所有我需要做的就是:

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

然后我将获得user_id25 的说明,其中的25是您的参数。

显然还有更多细节,这只是基本概念。


1
但是我可以联接,也可以联接存储过程中的多个表,而不必提供参数。
NoviceToDotNet 2011年

5
但是你为什么要这么做?你想达到什么目的?您可以将视图用作表使用...存储过程用于处理事务...视图用于使您的生活更轻松。
Patrick

1
将视图视为已存储的查询,因此,如果您发现有两个表需要进行大量连接才能完成工作,则可以创建一个视图进行操作,因此不必始终将它们连接在一起。
Patrick

2
我没有得到,请多描述一下。
NoviceToDotNet 2011年

2
是的,但是它然后存储了您的视图...,以便您可以像单个表一样调用它。这样,您只需创建一次联接,任何将来的使用都将直接引用该视图,该视图将调用基础sql,就好像它是一个表一样。
Patrick

107

这里有大量信息

这是一个很好的总结:

存储过程:

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

一个看法:

  • 难道接受参数
  • 可以用作较大查询中的构件
  • 只能包含一个SELECT查询
  • 可以进行修改的任何表
  • 但是可以(有时)用作INSERT,UPDATE或DELETE语句的目标。

6
此外,视图中不应包含任何“ order by”或“ top”子句
sksallaj

2
“不能用作INSERT,UPDATE或DELETE语句的目标”是什么意思?我们不能在存储过程中使用INSERT,DELETE,UPDATE吗?
Arsman Ahmad

“视图,不接受参数”,不是吗?例如视频:youtube.com/watch?
v=zK

:观点可以进行修改,以基本表/表csharp-video-tutorials.blogspot.com/2012/09/...
Khurram

8

首先,您需要了解,两者是不同的东西。Stored Procedures最适合用于INSERT-UPDATE-DELETE语句。而Views用于SELECT语句。您应该同时使用它们。

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


2
您可以使用“视图”更改基础表中的数据。视图是可更新的。
Dot Net开发人员

7

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

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

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

查看本文:查看与存储过程。正是您要找的东西


5

视图是一种将复杂对象保存SELECT在数据库中的简单方法。

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

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

  2. 取决于您的工作。

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

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

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


5

除了以上注释之外,我还想补充一些关于View的观点。

  1. 视图可以用来隐藏复杂性。想象一下这样一个场景,其中有5个人正在一个项目上工作,但其中只有一个人对复杂联接这样的数据库工作太满意了。在这种情况下,他可以创建视图,其他团队成员在查询任何单个表时可以轻松查询这些视图。
  2. View可以轻松实现安全性。假设我们有一个Employee表,其中包含敏感列,例如SalarySSN number。这些列对于未经授权查看它们的用户是不可见的。在这种情况下,我们可以创建一个View来选择表中不需要任何授权(例如NameAge等)的列,而无需暴露敏感列(例如我们之前提到的Salary等)。现在,我们可以删除直接查询表Employee的权限,而只保留对View的读取权限。这样,我们可以使用Views实现安全性。

4
  1. VIEW是一个动态查询,您可以在其中使用“ WHERE”-子句
  2. 存储过程是固定的数据选择,它返回预定义的结果
  3. 没有视图,也没有存储过程分配内存。仅实例化视图
  4. 一个表只是一个实体,一个视图可以从不同的实体或表收集数据

4

当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]

然后

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

DELETE from Junk Where ID>4

在这种情况下,INSERT和DELETE均有效

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

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


3

主要区别在于,查询视图时,会将其定义粘贴到查询中。过程也可以给出查询结果,但它的编译速度如此之快。另一种选择是索引视图。


1

@Patrick的话是正确的,但是要回答您的其他问题,View将在内存中创建自己,并且根据Joins,Data的类型以及是否进行了任何聚合,它可能是一个非常耗费内存的View。

存储过程使用临时哈希表(例如#tmpTable1)或使用@ tmpTable1在内存中进行所有处理。根据您要告诉它执行的操作。

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

显然,大多数情况下,如果不检索大量数据,则内存表会更快。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.