在建立视图时,sql server会保存元数据信息,用于描述视图、列、安全、依赖等信息;基础对象中的架构更改不影响视图的元数据;更改架构后使用sp_refreshview存储过程刷新视图是一个好习惯,这样对架构的更改就会反映在视图中。sql
为了掩饰架构改变后,不刷新视图元数据会发生什么状况,运行下面的代码建立表T1和视图V1数据库
use tempdb; go if OBJECT_ID ('dbo.v1') is not null drop view dbo.v1; if OBJECT_ID('dbo.T1') is not null drop table dbo.T1; create Table T1(col1 int ,col2 int); insert into T1(col1,col2) values(1,2); go create view V1 as select * from T1;
第一次建立V1时,sql server保存关于列的元数据信息,此时的列为Col1和Col2,若是你查询该视图,你将获得以下结果,即它包含两个列安全
接下来,咱们给基础表T1增长一列Col3架构
alter table dbo.T1 add col3 int;
T1的架构更改并无反应到视图的元数据中。视图中仍是包含两列,若是你再次查询视图,依然获得上图所示的结果。spa
要刷新视图的元数据,对V1运行sp_refreshview存储过程code
exec sp_refreshview 'dbo.V1';
再次执行查询server
select * from dbo.V1;
将获得以下结果对象
更改数据库的架构后,刷新全部视图的元数据信息是个好习惯blog
为避免编写sp_refreshview语句的繁琐过程,能够使用以下语句:get
select N'Exec sp_refreshview '+QUOTENAME(ViewName,'''')+';' as cmd from (select QUOTENAME(TABLE_SCHEMA)+N','+QUOTENAME(TABLE_NAME) as ViewName from INFORMATION_SCHEMA.VIEWS) as V where OBJECTPROPERTY(OBJECT_ID(ViewName),'IsSchemaBound')=0