存储过程和视图有什么区别?
我对以下几点感到困惑:
-
存储过程和视图有什么区别?
-
什么时候应该使用存储过程,以及在SQL Server中何时使用视图?
-
视图允许创builddynamic查询,我们可以传递参数吗?
-
哪一个是最快的,基于哪一个比另一个更快?
-
视图或存储过程是否永久分配内存?
-
这是什么意思,如果有人说视图创build一个虚拟表,而程序创build一个材料表?
请让我知道更多的点,如果有的话。
一个视图代表一个虚拟表。 您可以在视图中连接多个表,并使用该视图来呈现数据,就像数据来自单个表一样。
存储过程使用参数来执行函数…无论是更新和插入数据,还是返回单个值或数据集。
创build视图和存储过程 – 从微软那里得到一些关于何时以及为什么要使用它们的信息。
说我有两个表:
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
我将得到用户ID为25的描述。其中25是你的参数。
显然有很多细节,但这只是基本的想法。
网上提供了大量的信息
http://bytes.com/topic/sql-server/answers/450173-views-vs-stored-procedures-whats-difference
这是一个很好的总结:
存储过程:
- 接受参数
- 不能在更大的查询中用作构build块
- 可以包含几个语句,循环,IF ELSE等
- 可以对一个或多个表格进行修改
- 不能用作INSERT,UPDATE或DELETE语句的目标。
一个看法:
- 不接受参数
- 可以在更大的查询中用作构build块
- 只能包含一个SELECT查询
- 不能对任何表格进行修改
- 但可以(有时)用作INSERT,UPDATE或DELETE语句的目标。
首先你需要明白两者是不同的东西。 存储过程最适合用于INSERT-UPDATE-DELETE语句。 和“视图”用于SELECT语句。 你应该使用两个。
在视图中,你不能改变数据。
视图:它们是由数据库的不同实际表格中的一个或多个行和列组成的虚拟表。 它是多个表的行和列的模板。 你不能在这里传递任何参数。
存储过程:它们是预执行的sql语句的集合,您可以将参数作为input发送并检索输出数据。
视图可以在存储过程中使用,但存储过程不能在视图中使用…!
视图是保存数据库中复杂的SELECT
一种简单方法。
当简单的SQL只是不够的时候使用存储过程。 存储过程包含variables,循环和调用其他存储过程。 这是一种编程语言,而不是查询语言。
-
视图是静态的。 把它们想象成具有一定布局的新表格,并且使用它们创build的查询dynamic创build它们中的数据。 与任何SQL表一样,您可以使用
WHERE
,GROUP BY
和ORDER BY
对其进行sorting和过滤。 -
这取决于你做什么。
-
这取决于数据库。 简单的视图只是运行查询并过滤结果。 但是像Oracle这样的数据库允许创build一个“物化”视图,这个视图基本上是一个当视图底层数据发生变化时自动更新的表。
物化视图允许您在视图的列上创build索引(特别是在数据库中任何地方不存在的计算列上)。
-
我不明白你在说什么。
- VIEW是一个dynamic查询,您可以在其中使用“WHERE”–Llause
- 存储过程是一个固定的数据select,它返回一个预定义的结果
- 也不是一个视图,也不是一个存储过程分配内存。 只有一个物化的看法
- 一个TABLE只是一个ENTITY,一个视图可以从不同的实体或表中收集数据
主要的区别是,当你查询一个视图时,它的定义被粘贴到你的查询中。 程序也可以给出查询结果,但是它被编译并且速度更快。 另一种select是索引视图..
SQL视图是一个基于SQL SELECT查询的虚拟表。 一个视图引用一个或多个现有的数据库表或其他视图。 它是数据库的快照,而存储过程是一组编译为单个执行计划的Transact-SQL语句。
视图很简单地展示存储在数据库表中的数据,而存储过程是一组可以执行的语句。
视图更快,因为它显示引用的表中的数据,而存储过程则执行sql语句。
检查这篇文章: 查看与存储过程 。 正是你在找什么
@Patrick与他所说的是正确的,但回答你的其他问题,一个View将在内存中创build自己,并根据联接的types,数据,如果有任何聚合完成,它可能是一个相当饥饿的视图。
存储过程使用Temp Hash Table(例如#tmpTable1)或使用@ tmpTable1在内存中执行所有处理。 取决于你想要告诉它做什么。
存储过程就像一个函数,但直接由其名称来调用。 而不是在查询本身中实际使用的函数。
显然大部分时间内存表更快,如果你没有检索大量的数据。
当Maheshbuild议你不能改变视图中的数据时,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。 但是,您可以有时INSERT到一个视图…
我创build了一个使用现有表的视图…
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都起作用了
显然你不能更新任何聚合或计算的字段,但任何只是直观的视图都应该是可更新的。
如果视图包含多个表,则不能插入或删除,但如果视图只是一个表的子集,那么通常情况下可以。
除了上述意见之外,我还想补充一点意见。
- 视图可以用来隐藏复杂性。 想象一下,有5个人在一个项目上工作的场景,但是其中只有一个对于像复杂联接这样的数据库来说太好了。 在这种情况下,他可以创build视图,在查询任何单个表时,可以由其他团队成员轻松查询。
- 安全性可以通过视图轻松实现。 假设我们有一个Table Employee ,它包含了Salary , SSN等敏感列。 对于无权查看这些列的用户,这些列不应该是可见的。 在这种情况下,我们可以创build一个View,在不需要任何授权(如Name , Age等)的情况下select表中的列,而不会暴露敏感列(如前面提到的Salary等)。 现在我们可以删除直接查询表Employee的权限,只保留View的读权限。 这样,我们可以使用Views实现安全。