我对以下几点感到困惑:
存储过程与视图有什么区别?
我应该何时使用存储过程,何时应该在SQL Server中使用视图?
视图是否允许创建我们可以传递参数的动态查询?
哪一个最快,哪个比另一个快?
视图或存储过程是否永久分配内存?
如果有人说视图会创建虚拟表格,而程序会创建材料表格,这意味着什么?
请告诉我更多要点,如果有的话。
答案 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
以下是一个很好的总结:
存储过程:
观点:
答案 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不够时,使用存储过程。存储过程包含变量,循环和对其他存储过程的调用。它是一种编程语言,而不是查询语言。
视图是静态的。将它们视为具有特定布局的新表,并使用您创建的查询即时创建其中的数据。与任何SQL表一样,您可以使用WHERE
,GROUP BY
和ORDER BY
对其进行排序和过滤。
取决于你的工作。
取决于数据库。简单视图只需运行查询并过滤结果。但是像Oracle这样的数据库允许创建一个“物化”视图,它基本上是一个表,当视图的基础数据发生变化时会自动更新。
物化视图允许您在视图的列上创建索引(尤其是在数据库中任何位置都不存在的计算列上)。
我不明白你在说什么。
答案 5 :(得分:3)
答案 6 :(得分:3)
主要区别在于,当您查询视图时,它的定义将粘贴到您的查询中。过程也可以给出查询结果,但是它被编译并且速度更快。另一种选择是索引视图..
答案 7 :(得分:2)
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)
存储过程使用Temp Hash Table(例如#tmpTable1)或使用@ tmpTable1在内存中完成所有处理。取决于你想告诉它做什么。
存储过程就像一个函数,但它的名称直接调用。而不是在查询本身内实际使用的函数。
显然,如果您没有检索到大量数据,大多数情况下内存表会更快。
答案 9 :(得分:1)
除了上述评论之外,我想补充一些关于观点的观点。