Nov*_*Net 118 sql stored-procedures sql-server-2005 views
我对以下几点感到困惑:
存储过程和视图之间有什么区别?
我应该何时使用存储过程,何时应该在SQL Server中使用视图?
视图是否允许创建我们可以传递参数的动态查询?
哪一个最快,哪个基于哪一个比另一个快?
视图或存储过程是否永久分配内存?
如果有人说视图创建虚拟表,而程序创建材料表,这意味着什么?
如果有的话,请告诉我更多的要点.
Pat*_*ick 121
视图表示虚拟表.您可以在视图中连接多个表,并使用视图显示数据,就像数据来自单个表一样.
存储过程使用参数来执行函数...无论是更新和插入数据,还是返回单个值或数据集.
创建视图和存储过程 - 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
Run Code Online (Sandbox Code Playgroud)
因此,将来如果我想通过用户ID查询profile_description ...我所要做的就是
SELECT profile_description FROM vw_user_profile WHERE user_id = @ID
Run Code Online (Sandbox Code Playgroud)
该代码可用于存储过程,如:
create procedure dbo.getDesc
@ID int
AS
begin
SELECT profile_description FROM vw_user_profile WHERE user_id = @ID
END
GO
Run Code Online (Sandbox Code Playgroud)
所以以后我可以打电话
dbo.getDesc 25
Run Code Online (Sandbox Code Playgroud)
我将得到用户ID 25的描述.其中25是你的参数.
显然有很多细节,但这只是基本的想法.
cus*_*ar9 92
像这样的网上有很多信息
这是一个很好的总结:
存储过程:
一个看法:
首先,你需要了解两者是不同的东西.存储过程最适用于INSERT-UPDATE-DELETE语句.和视图用于SELECT语句.你应该同时使用两者.
在视图中,您无法更改数据.某些数据库具有可更新的视图,您可以在视图上使用INSERT-UPDATE-DELETE.
除了上面的评论,我想补充几点关于视图。
小智 5
视图是SELECT在数据库中保存复合体的简单方法.
当简单的SQL不够时,使用存储过程.存储过程包含变量,循环和对其他存储过程的调用.它是一种编程语言,而不是一种查询语言.
视图是静态的.将它们视为具有特定布局的新表,并使用您创建的查询即时创建其中的数据.与任何SQL表,您可以排序和过滤用它WHERE,GROUP BY和ORDER BY.
这取决于你做了什么.
这取决于数据库.简单视图只需运行查询并过滤结果.但是像Oracle这样的数据库允许创建一个"物化"视图,它基本上是一个表,当视图的基础数据发生变化时会自动更新.
物化视图允许您在视图的列上创建索引(尤其是在数据库中任何位置都不存在的计算列上).
我不明白你在说什么.
小智 5
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
Run Code Online (Sandbox Code Playgroud)
我可以更新数据......作为一个例子,我可以做这些......
Update vw_user_profile Set profile_description='Manager' where user_id=4
Run Code Online (Sandbox Code Playgroud)
或者
Update tbl_profile Set profile_description='Manager' where user_id=4
Run Code Online (Sandbox Code Playgroud)
您不能插入此视图,因为并非所有表中的所有字段都存在,并且我假设 PROFILE_ID 是主键并且不能为 NULL。但是,您有时可以插入视图...
我使用...在现有表上创建了一个视图
Create View Junk as SELECT * from [TableName]
Run Code Online (Sandbox Code Playgroud)
然后
Insert into junk (Code,name) values
('glyn','Glyn Roberts'),
('Mary','Maryann Roberts')
Run Code Online (Sandbox Code Playgroud)
和
DELETE from Junk Where ID>4
Run Code Online (Sandbox Code Playgroud)
INSERT 和 DELETE 在这种情况下都有效
显然,您不能更新任何聚合或计算的字段,但任何只是直接视图的视图都应该是可更新的。
如果视图包含多个表,则不能插入或删除,但如果视图只是一个表的子集,则通常可以。