刷新视图

问题:


 

当我们创建这样一个视图(myView):

create view myView As select * from myTable

 

*注:myTable的结构:myTable(id
int)*

新生,我们改变了myTable的布局,扩充一个字段(newCol):

alter table myTable add newCol nvarchar(50)

当大家举办查询视图操作,发现重返的是未修改myTable表结构前之字段ID,即少了newCol字段:

 图片 1

 

 

            图1.

 

分析:


 

 最先之时节,我们创制的视图myView,

‘create view myView As select * from myTable’

sql server
会把中myTable的所有字段(即改结构前的ID字段)存储在系表中,形成一个坚韧不拔不懈元数据。针对视图对象,大家好透过系统视图查询sys.objects
& sys.columns來查詢:

select b.*
    from sys.objects a
        inner join sys.columns b on b.object_id=a.object_id
    where a.name='myView'

 

图片 2

                                                                                             
图2.

当觊觎2.我们好观察视图重返的字段,包含字段名,数据类型,长度,精度,是否也null等信息,假使我们查回myTable中的ID字段信息,会发觉与视图的叙述一致:

select b.*
    from sys.objects a
        inner join sys.columns b on b.object_id=a.object_id
    where a.name='myTable'

 

 图片 3

                                                                                           
图3

要,我们修改了myTable表结构,会发觉sys.columns没有以更新,查询的结果以及图2一致。也是说视图对象myView的持久元数据没有更新至,大家询问视图的构造要修改前的。

 

解决:


 

 

对问题,sql server
专门一个系存储过程来更新视图对象的老大数据sp_refreshview 

sp_refreshview [ @viewname = ] 'viewname' 

 或以系统存储过程:sp_refreshsqlmodule  

sys.sp_refreshsqlmodule [ @name = ] 'module_name' 
    [ , [ @namespace = ] ' <class> ' ]

 

扩展


 这里自己勾勒了一个通用的蕴藏过程来更新类似的题材,实现效益是:

更新当前数据库被指定的非绑定到架构的仓储过程、用户定义函数、视图、DML
触发器的第一数据

use master
go
if object_id('sp_RefreshSqlModule_All') Is not null
    Drop proc sp_RefreshSqlModule_All
go
create proc sp_RefreshSqlModule_All
As
/*更新当前数据库中指定的非绑定到架构的存储过程、用户定义函数、视图、DML 触发器的元数据*/

declare @sql nvarchar(max)

select @sql=isnull(@sql+Char(13)+char(10),'')+'exec sys.sp_refreshsqlmodule '''+quotename(b.name)+'.'+quotename(a.name)+''';'
    from sys.objects a 
        inner join sys.schemas b on b.schema_id=a.schema_id
    where a.type in ('P','V','TR','FN','IF','TF')
        and a.is_ms_shipped=0
        and a.name <>'sp_RefreshSqlModule_All'
        and not exists(select 1 
                            from sys.extended_properties x
                            where x.major_id=a.object_id
                                and x.minor_id=0
                                and x.class=1
                                and x.name='microsoft_database_tools_support'
                        )

exec(@sql)
print '已更新存储过程,用户定义函数,视图,DML触发器的元数据!'    
go

exec sp_ms_marksystemobject 'sp_RefreshSqlModule_All'
go

 

‘exec
sp_ms_marksystemobject ‘sp_RefreshSqlModule_All’’
注册为系统对象,那样在每一个数据库下还好灵活调用。

调用方法:

图片 4

该存储过程就当脚環境測試通過:

SQL Server 2005/2005/2008R2/2012

注:不支持SQL Server 2000

 

 

 

 

 

 

 

相关文章