菜单

刷新视图

2018年11月16日 - sqlite

依照我们创建了一个表T1同一个T1的视图V1,然后再次改T1,再看V1底结果:
第一创建表T1:

问题:

复制代码 代码如下:


IF OBJECT_ID(‘T1’) IS NOT NULL
DROP TABLE T1
CREATE TABLE T1(col1 INT,col2 INT)
INSERT INTO T1(col1,col2) VALUES(1,2)
GO

 

然后创建T1的视图V1:

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

复制代码 代码如下:

create view myView As select * from myTable

CREATE VIEW V1
AS
SELECT * FROM T1

 

当现实实践备受,要避在视图中的SELECT语句被行使*,在即时不过是现身说法。如果您询问视图V1就见面面世以下结果:
manbetx网页手机登录版 1 

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

对接下,我们本着表T1补充加相同排列col3:

新兴,我们转移了myTable的布局,增加一个字段(newCol):

复制代码 代码如下:

alter table myTable add newCol nvarchar(50)

ALTER TABLE T1 ADD col3 INT

当我们执行查询视图操作,发现返回的凡休修改myTable表结构前的字段ID,即少了newCol字段:

然后还询问视图V1,你想这的结果是三排呢,还是要排呢?答案是二列。T1架的改动,并无影响至视图的首先数据遭到,这时候,如果我们设刷新一下视图V1,我们不怕可以用:EXEC
sp_refreshview V1 发令, 再次查询,V1的结果就是三列了。

 manbetx网页手机登录版 2

你可能感兴趣之章:

 

 

            图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'

 

manbetx网页手机登录版 3

                                                                                             
图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'

 

 manbetx网页手机登录版 4

                                                                                           
图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’’
注册为系统对象,这样以各级一个数据库下还可以灵活调用。

调用方法:

manbetx网页手机登录版 5

拖欠存储过程都当脚環境測試通過:

SQL Server 2005/2005/2008R2/2012

注:不支持SQL Server 2000

 

 

 

 

 

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图