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

有几点我很困惑:

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

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

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

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

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

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

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

262066 次浏览

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

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

创建视图和存储过程-包含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

因此,如果我想在将来通过user_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

我将获得user_id25的描述,其中25是您的参数。

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

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

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

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

查看此文章:查看VS存储过程。正是你想要的。

首先,你需要理解,两者是不同的东西。Stored Procedures最适合用于INSERT-UPDATE-DELETE语句。而Views用于SELECT语句。你应该两个都用。

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

大量信息可在这里

这里有一个很好的总结:

存储过程:

  • 接受参数
  • _为0的_ABC是否可以在较大的查询中用作构建块
  • 可以包含多个语句、循环、if else等。
  • 可以对一个或多个表执行修改
  • 不能用作插入、更新或删除的目标 陈述。

A视图:

  • 不是是否接受参数
  • 可以在较大的查询中用作构造块
  • 只能包含一个单选择查询
  • 不是是否可以对任何表执行修改
  • 但(有时)可以用作插入、更新或 删除语句。

@Patrick所说的是正确的,但要回答您的其他问题,视图将在内存中自行创建,并且根据连接的类型、数据以及是否进行了任何聚合,它可能是一个非常需要内存的视图。

存储过程使用临时哈希表(例如#tmptable1)或在内存中使用@tmptable1执行所有处理。这取决于你想让它做什么。

存储过程类似于函数,但通过其名称直接调用。而不是在查询本身内部实际使用的函数。

很明显,如果你没有检索大量的数据,大多数时候内存表会更快。

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

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

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

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

  2. 这取决于你做什么。

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

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

  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

您不能插入到此视图中,因为并非所有表中的所有字段都存在,并且我假设配置文件_ID是主键,并且不能为空。 但是,您有时可以在视图中插入..

我使用..在现有表上创建了一个视图。

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

在这种情况下,插入和删除都起作用。

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

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

除了上述评论外,我还想补充几点看法。

  1. 视图可用于隐藏复杂性。想象一下这样一个场景:5个人在做一个项目,但其中只有一个人对数据库的东西(如复杂连接)太擅长了。在这种情况下,他可以创建其他团队成员在查询任何单个表时可以轻松查询的视图。
  2. 视图可以很容易地实现安全性。假设我们有一个ABC_0_的表,其中包含薪水SSN号码这样的敏感列。未授权查看这些列的用户不应看到这些列。在这种情况下,我们可以创建一个视图,选择表中不需要任何授权的列,如名字年龄等,而不公开敏感列(如工资等)。我们之前提到过)。现在,我们可以删除直接查询表雇员的权限,而只保留视图的读取权限。通过这种方式,我们可以使用视图来实现安全性。