视图是否自动更新

Ham*_*han 49 sql view

如果我JOINCROSS APPLY两个表并创建一个VIEW,当我更新两个表中的任何一个或者我向其中任何一个表添加记录时,视图是否会自动更新?

这些新记录会出现在VIEW吗?

Cur*_*urt 59

是的,每次使用它们都会更新.

我认为微软总结了一个非常清楚的观点:

视图可以被视为虚拟表或存储查询.

http://msdn.microsoft.com/en-us/library/aa214068%28v=sql.80%29.aspx

视图不会自动缓存.

当您SELECT从一个视图,数据库运行存储在视图的查询得到的结果集在你的语句中使用

您在视图中"看到"的数据实际上并未存储在任何位置,而是从动态表中生成的.

因此,请谨慎运行非常复杂的视图.始终考虑到在访问结果集之前必须执行视图.

  • 您无法将记录插入视图中 (2认同)

Mic*_*ner 13

简答

是的,如果您查询视图,它将反映其所基于的表中已更改的数据。

长答案

前言

我读了这些答案,这让我质疑视图是如何工作的,所以我做了一些研究和我发现的支持,但也添加到列出的答案中,所以我想将其添加到锅中。

我使用 *# 来获取参考文献,其定义位于底部。

概述

有不同类型的视图,并且它们有不同类型的行为。有些被存储然后经常更新,而另一些则根本不存储并动态计算。

视图的定义

“视图是一个虚拟表,其内容由查询定义......除非建立索引,否则视图不会作为数据库中存储的数据值集而存在。” *1

非索引视图

“与永久表不同,视图没有其数据的物理表示,除非您在其上创建索引。每当您对非索引视图发出查询时,SQL Server 实际上必须访问基础表。除非另有说明...” *1

因此,非索引视图是在调用时计算的。

索引视图

“索引视图是一个已经具体化的视图。这意味着视图定义已经被计算并且结果数据就像表一样存储。” *2

由于存储了索引视图,因此它们不太适合经常更新的表,因为它们需要不断更新具体化数据及其索引。

回答

在这两种情况下,索引视图或非索引视图都会在您调用视图时或根据是否已索引进行更改时反映它们引用的表中的更改。

参考

*1 Microsoft SQL Server 2008 T-SQL 编程内部由 Microsoft Press 出版版权所有 2010

*2 https://learn.microsoft.com/en-us/sql/relational-databases/views/views?view=sql-server-ver15


OTT*_*TTA 12

视图基本上是一个存储的查询,它不保存任何数据,因此在构建它的表时不会更新.但是,只要引用该视图,它所基于的查询就会运行,因此您将看到对基表所做的更改.


小智 5

是的,视图是针对基础表/视图的SELECT查询.如果您修改基础表中的数据,并且该范围包含在视图定义中,那么您将看到修改后的数据.


yog*_*rji 5

是的,每次都会更新记录。

但是如果你修改表定义。不要忘记refresh查看。

exec sp_refreshview @viewname

不要SELECT *在视图定义中使用,而是使用column name