存储过程和视图有什么区别?
在 SQL Server 中,何时应该使用存储过程,何时应该使用视图?
视图是否允许创建动态查询,以便我们可以传递参数?
哪一个更快,并且基于什么理由一个比另一个更快?
视图或存储过程是否会永久分配内存?
如果有人说视图创建了虚拟表,而存储过程则创建了物料表,这是什么意思?
如有其他需要,请告知。
存储过程和视图有什么区别?
在 SQL Server 中,何时应该使用存储过程,何时应该使用视图?
视图是否允许创建动态查询,以便我们可以传递参数?
哪一个更快,并且基于什么理由一个比另一个更快?
视图或存储过程是否会永久分配内存?
如果有人说视图创建了虚拟表,而存储过程则创建了物料表,这是什么意思?
如有其他需要,请告知。
视图代表一个虚拟的表格。您可以在视图中连接多个表格,并使用该视图将数据呈现为来自单个表格的数据。
存储过程使用参数执行函数...无论是更新和插入数据,还是返回单个值或数据集。
创建视图和存储过程 - Microsoft提供了一些有关何时以及为什么要使用它们的信息。
如果我有两个表:
tbl_user
,具有列:user_id
,user_name
,user_pw
tbl_profile
,具有列:profile_id
,user_id
,profile_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_id
为25的描述,其中25
是您的参数。
显然还有许多细节,这只是基本思路。
这里有大量的信息(点击此处)
以下是一个好的总结:
存储过程:
视图:
SQL视图是一种虚拟表,它基于SQL SELECT查询。视图引用一个或多个现有的数据库表或其他视图。它是数据库的快照,而存储过程是编译成单个执行计划的Transact-SQL语句组。
视图简单地展示存储在数据库表中的数据,而存储过程是可以执行的语句组。
由于视图显示来自所引用表的数据,因此更快,而存储过程则执行sql语句。
请查看本文:视图与存储过程。正是您所寻找的。
首先需要理解的是,这两个东西是不同的。 存储过程
最适合用于 INSERT-UPDATE-DELETE
语句。而 视图
则用于 SELECT
语句。你应该同时使用它们。
在视图中您无法更改数据。 一些数据库具有可更新的视图,您可以在 视图
上使用 INSERT-UPDATE-DELETE
。
视图是在数据库中保存复杂SELECT语句的简单方法。
存储过程用于当简单SQL不足以满足需求时。存储过程包含变量、循环和对其他存储过程的调用。它是一种编程语言,而不是查询语言。
视图是静态的。将其视为具有特定布局的新表,其中的数据是使用创建视图时的查询动态生成的。与任何SQL表一样,可以使用WHERE、GROUP BY和ORDER BY进行排序和筛选。
这取决于你要做什么。
这取决于数据库。简单视图只运行查询并过滤结果。但像Oracle这样的数据库允许创建“物化”视图,这基本上是一个表,在视图的基础数据发生更改时会自动更新。
物化视图允许您在视图的列上创建索引(尤其是计算列,在数据库中不存在)。
我不明白你在说什么。
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是主键且不能为空,因此您无法向此视图中插入内容。 但有时您可以向视图中插入数据...
我使用...在现有表格上创建了一个视图。
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都起作用了。
显然,您无法更新任何聚合或计算的字段,但是任何仅为直接视图的视图都应该是可更新的。
如果视图包含多个表,则无法插入或删除,但如果视图仅是一个表的子集,则通常可以。
主要区别在于当您查询视图时,它的定义会被粘贴到您的查询中。存储过程也可以提供查询结果,但它是经过编译的,因此速度更快。另一个选项是索引视图。