我感到困惑的几个要点:存储过程和视图之间有什么区别?
是什么一个存储过程,视图之间的区别?
什么时候应该使用存储过程,以及何时应该在SQL Server中使用视图?
视图允许创建动态查询,我们可以传递参数吗?
哪一个是最快的,基于哪一个比另一个更快?
视图或存储过程是否永久分配内存?
如果有人说视图创建了一个虚拟表,而程序创建了一个材料表,那么这是什么意思?
请让我知道更多的积分,如果有的话。
我感到困惑的几个要点:存储过程和视图之间有什么区别?
是什么一个存储过程,视图之间的区别?
什么时候应该使用存储过程,以及何时应该在SQL Server中使用视图?
视图允许创建动态查询,我们可以传递参数吗?
哪一个是最快的,基于哪一个比另一个更快?
视图或存储过程是否永久分配内存?
如果有人说视图创建了一个虚拟表,而程序创建了一个材料表,那么这是什么意思?
请让我知道更多的积分,如果有的话。
一个视图代表一个虚拟表。您可以在视图中连接多个表,并使用该视图呈现数据,就好像数据来自单个表一样。
存储过程使用参数来执行函数...无论是更新和插入数据还是返回单个值或数据集。
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是你的参数。
显然有很多细节,但这只是基本的想法。
SQL View是一个基于SQL SELECT查询的虚拟表。一个视图引用一个或多个现有的数据库表或其他视图。它是数据库的快照,而存储过程是一组编译为单个执行计划的Transact-SQL语句。
查看很简单地展示存储在数据库表中的数据,而存储过程是一组可执行的语句。
视图更快,因为它显示引用的表中的数据,而存储过程执行sql语句。
选中这篇文章:View vs Stored Procedures。你正在寻找什么
首先你需要了解两者是不同的东西。存储过程最适用于INSERT-UPDATE-DELETE语句。和Views用于SELECT语句。你应该使用两者。
在视图中,您无法更改数据。
大量信息的网页
http://bytes.com/topic/sql-server/answers/450173-views-vs-stored-procedures-whats-difference
这里就可以是一个很好的总结:
存储过程:
视图:
+1列举主要差异。 – 2013-10-07 23:33:21
其他视图不应该包含任何“按顺序排列”或“顶部”子句 – sksallaj 2016-03-31 16:34:50
@Patrick与他所说的是正确的,但要回答您的其他问题,视图将在内存中创建自己,并根据联接类型,数据以及是否有任何聚合完成,它可能是相当内存饥饿的看法。
存储过程使用Temp Hash Table例如#tmpTable1或使用@ tmpTable1在内存中执行所有处理。取决于你想告诉它做什么。
存储过程就像一个函数,但直接由其名称调用。而不是在查询本身中实际使用的函数。
显然大部分时间内存表速度更快,如果你没有检索大量的数据。
数据视图是一个简单的方法来拯救一个复杂的SELECT
在数据库中。
当简单SQL不够时,使用存储过程。存储过程包含变量,循环和调用其他存储过程。这是一种编程语言,而不是查询语言。
视图是静态的。将它们视为具有特定布局的新表格,并使用您创建的查询来即时创建它们中的数据。与任何SQL表一样,您可以使用WHERE
,GROUP BY
和ORDER BY
对其进行排序和过滤。
这取决于你做什么。
这取决于数据库。简单的视图只是运行查询并过滤结果。但是像Oracle这样的数据库允许创建一个“物化”视图,这个视图基本上是一个当视图底层数据发生变化时自动更新的表格。
物化视图允许您在视图的列上创建索引(特别是在数据库中任何位置不存在的计算列上)。
我不明白你在说什么。
主要区别在于,当您查询视图时,它的定义会粘贴到您的查询中。程序也可以给出查询结果,但是它已经被编译并且速度更快。另一个选项是索引视图..
视图:它们是由来自数据库的不同实际表格的一个或多个行和列组成的虚拟表。它是多个表格的行和列的模板。你不能在这里传递任何参数。
存储过程:它们是预执行的sql语句的集合,您可以将参数作为输入发送并检索输出数据。
视图可以在存储过程中使用,但存储过程不能在视图中使用...!
当他建议你不能改变视图中的数据时,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都在这种情况下工作
显然你不能更新任何聚合或计算的字段,但任何只是直观的视图都应该是可更新的。
如果视图包含多个表格,则不能插入或删除,但如果视图只是一个表格的子集,那么通常情况下可以。
除了上面的评论,我想补充几点关于Views。
但我可以加入可以加入存储过程中的多个表以及我不必提供参数。 – NoviceToDotNet 2011-03-04 14:31:02
但为什么你会这样做?你想达到什么目的?你可以使用一个视图作为表...存储过程是为了做事...视图是为了让你的生活更轻松。 – Patrick 2011-03-04 14:31:46
将视图看作存储的查询,所以如果您有两张表,您发现必须加入很多工作才能完成工作,则可以创建一个工作视图,以便您不必一直加入它们。 – Patrick 2011-03-04 14:33:27