sql 刷新视图

发布时间:2018-11-15  栏目:sqlite  评论:0 Comments

按照我们创建了一个表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就会并发以下结果:
图片 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的结果就是是三排列了。

 图片 2

若或许感兴趣之稿子:

  • MySQL入门教程(七)之视图
  • MySQL中视图的用以及多表INNER
    JOIN的技巧分享
  • mysql触发器实现oracle物化视图示例代码
  • 根据mysql事务、视图、存储过程、触发器的采取分析
  • MySQL笔记之视图的使用详解
  • MySQL 视图
    第1349哀号错误解决方式
  • SQL
    SERVER先判断视图是否存在然后再创视图的讲话
  • 囤过程解密(破解函数,过程,触发器,视图.仅限于SQLSERVER2000)
  • sql
    server判断数据库、表、列、视图是否在
  • MySQL 视图的功底操作(五)

 

 

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

 

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

 

 图片 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’’
注册也系统对象,这样以列一个数据库下还足以活调用。

调用方法:

图片 5

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

SQL Server 2005/2005/2008R2/2012

注:不支持SQL Server 2000

 

 

 

 

 

 

 

留下评论

网站地图xml地图