存储过程和视图之间有什么区别?

Nov*_*Net 118 sql stored-procedures sql-server-2005 views

我对以下几点感到困惑:

  1. 存储过程和视图之间有什么区别?

  2. 我应该何时使用存储过程,何时应该在SQL Server中使用视图?

  3. 视图是否允许创建我们可以传递参数的动态查询?

  4. 哪一个最快,哪个基于哪一个比另一个快?

  5. 视图或存储过程是否永久分配内存?

  6. 如果有人说视图创建虚拟表,而程序创建材料表,这意味着什么?

如果有的话,请告诉我更多的要点.

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是你的参数.

显然有很多细节,但这只是基本的想法.

  • 但为什么你会这样做?你想达到什么目的?您可以将视图用作表格...存储过程用于执行操作...视图用于使您的生活更轻松. (5认同)
  • 将视图视为存储的查询,因此如果您有两个表,您发现必须连接很多表才能完成工作,则可以创建一个视图来处理,这样您就不必一直连接它们。 (3认同)
  • 但我可以连接可以连接存储过程中的多个表,并且不需要提供参数。 (2认同)
  • 我没有收到,请多说一点. (2认同)
  • 对,但它存储你的视图然后......所以你可以像一张桌子一样调用它.这样你创建你的连接一次,任何将来使用引用直接调用底层sql的视图就像它是一个表一样. (2认同)

cus*_*ar9 92

这样的网上有很多信息

这是一个很好的总结:

存储过程:

  • 接受参数
  • 可以NOT在一个大的查询被用作构建块
  • 可以包含多个语句,循环,IF ELSE等.
  • 可以对一个或多个表执行修改
  • 不能用作INSERT,UPDATE或DELETE语句的目标.

一个看法:

  • 不接受参数
  • 可以在更大的查询中用作构建块
  • 只能包含一个SELECT查询
  • 不能对任何表执行修改
  • 但是(有时)可以用作INSERT,UPDATE或DELETE语句的目标.

  • 此外,Views不应包含任何"order by"或"top"子句 (6认同)
  • 列举主要差异的+1. (4认同)
  • “不能用作INSERT,UPDATE或DELETE语句的目标”的含义是什么?我们不能在存储过程中使用INSERT,DELETE,UPDATE吗? (2认同)
  • @ArsmanAhmad 澄清一下:您可以在存储过程中使用 INSERT、UPDATE 和 DELETE。但存储过程不能作为 INSERT、UPDATE 或 DELETE 语句的目标。例如:您不能将数据插入存储过程。存储过程不是任何类型的表,因此您不能向其中插入数据、更新其中的数据或删除其中的数据。 (2认同)

Mah*_*esh 9

首先,你需要了解两者是不同的东西.存储过程最适用于INSERT-UPDATE-DELETE语句.和视图用于SELECT语句.你应该同时使用两者.

在视图中,您无法更改数据.某些数据库具有可更新的视图,您可以在视图上使用INSERT-UPDATE-DELETE.

  • 您可以使用Views更改基础表中的数据.视图是可更新的. (2认同)

Aje*_*sad 6

除了上面的评论,我想补充几点关于视图。

  1. 视图可用于隐藏复杂性。想象一个场景,其中 5 个人正在处理一个项目,但只有其中一个人对复杂联接等数据库内容太擅长了。在这种情况下,他可以创建视图,其他团队成员可以在查询任何单个表时轻松查询这些视图。
  2. 视图可以轻松实现安全性。假设我们有一个表Employee,其中包含诸如SalarySSN number 之类的敏感列。这些列不应该对无权查看它们的用户可见。在这种情况下,我们可以创建一个视图,选择不需要任何授权的表中的列,如NameAge等,而不会暴露敏感列(如我们之前提到的 Salary 等)。现在我们可以去掉直接查询Employee表的权限,只保留View的读权限。这样,我们就可以使用 Views 来实现安全性。


reg*_*gie 5

SQL视图是基于SQL SELECT查询的虚拟表。一个视图引用一个或多个现有数据库表或其他视图。它是数据库的快照,而存储过程是编译成单个执行计划的一组Transact-SQL语句。

视图是简单的展示存储在数据库表中的数据,而存储过程是一组可以执行的语句。

视图的速度更快,因为它显示引用的表中的数据,而存储过程执行sql语句。

查看本文:查看与存储过程。正是您要找的东西


小智 5

  1. VIEW 是一个动态查询,您可以在其中使用“WHERE”-Clause
  2. 存储过程是一个固定的数据选择,它返回一个预定义的结果
  3. 既不是视图,也不是存储过程分配内存。只有物化视图
  4. 一个表只是一个实体,一个视图可以从不同的实体或表中收集数据


Aar*_*lla 5

视图是SELECT在数据库中保存复合体的简单方法.

当简单的SQL不够时,使用存储过程.存储过程包含变量,循环和对其他存储过程的调用.它是一种编程语言,而不是一种查询语言.

  1. 视图是静态的.将它们视为具有特定布局的新表,并使用您创建的查询即时创建其中的数据.与任何SQL表,您可以排序和过滤用它WHERE,GROUP BYORDER BY.

  2. 这取决于你做了什么.

  3. 这取决于数据库.简单视图只需运行查询并过滤结果.但是像Oracle这样的数据库允许创建一个"物化"视图,它基本上是一个表,当视图的基础数据发生变化时会自动更新.

    物化视图允许您在视图的列上创建索引(尤其是在数据库中任何位置都不存在的计算列上).

  4. 我不明白你在说什么.


小智 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 在这种情况下都有效

显然,您不能更新任何聚合或计算的字段,但任何只是直接视图的视图都应该是可更新的。

如果视图包含多个表,则不能插入或删除,但如果视图只是一个表的子集,则通常可以。