提醒:表修改后,视图不会自动更新列!

时间:2022-11-03 05:57:42
最近开发程序,因此问题,查了很久才发现问题所在,在此公告一下,供大家参考!

create view v_table1 as select * from table
if object_id('table1') is not null drop table table1
go
create table table1 (id int,fname varchar(10))
go
insert into table1 (id,fname)
select 1,'a'
union select 2,'b'
union select 3,'c'
union select 4,'d'
go
create view v_table1 as select * from table1
go 
select * from v_table1
go 
--修改表结构
create table table1_tmp (id int,fname1 varchar(10) default 0,fname varchar(10))
go
insert into table1_tmp(id,fname) select id,fname from table1
go 
drop table table1
go
exec sp_rename 'table1_tmp','table1'
go
select * from v_table1


结果
id          fname
----------- ----------
1           a
2           b
3           c
4           d

(4 行受影响)



id          fname
----------- ----------
1           0
2           0
3           0
4           0

(4 行受影响)

必须

23 个解决方案

#1


学习

#2


为啥啊 我也遇到过 

凡是试图中 select  * 的都会这样啊

#3


sp_refreshview.

#4


学习

#5


必须再执行一次
alter view v_table1 as select * from table1

select * from v_table1
才会返回修改后的表结果

#6


学习.

#7


对啊 我上次是在表中增加了一列 结果在视图中查不到 
引用 5 楼 cxmcxm 的回复:
必须再执行一次
SQL codealterview v_table1asselect*from table1
select * from v_table1
才会返回修改后的表结果

#8



if object_id('table1') is not null drop table table1
go
create table table1 (id int,fname varchar(10))
go
insert into table1 (id,fname)
select 1,'a'
union select 2,'b'
union select 3,'c'
union select 4,'d'
go
create view v_table1 
as
select * from table1
go 

select * from v_table1
go 
--修改表结构,增加列
alter table table1 add ps varchar(10) default('a') --增加列后,视图不会更新
go

--查看:
select * from table1
select * from v_table1
go 

#9


学习

#10


增加列,也许不会.这个有待测试.

如果只是更改数据,肯定会.

#11


至少我这出现过
引用 10 楼 dawugui 的回复:
增加列,也许不会.这个有待测试.

如果只是更改数据,肯定会.

#12


..

#13


create table tb(id int,name varchar(10))
go
create view V
as 
select * from tb
go

select * from v
/*
id          name       
----------- ---------- 

(所影响的行数为 0 行)
*/
alter table tb
add  name2 varchar(2)
go


select * from v
/*
id          name       
----------- ---------- 

(所影响的行数为 0 行)
*/
drop table tb
drop view v

#14


其实我再博客里面说过的
sp_refreshview 刷新下视图就可以了
视图刷新的问题 sp_refreshview
    有时候你会发现当你修改基础表的结构后,视图并没有跟着变,解决的方法就是修改后立即进行视图的刷新.特别是你试图出现select *的时候
        USE tempdb;
        GO
        IF OBJECT_ID('dbo.V1') IS NOT NULL
          DROP VIEW dbo.V1;
        GO
        IF OBJECT_ID('dbo.T1') IS NOT NULL
          DROP TABLE dbo.T1;
        GO
        
        CREATE TABLE dbo.T1(col1 INT, col2 INT);
        INSERT INTO dbo.T1(col1, col2) VALUES(1, 2);
        GO
        --建立视图
        CREATE VIEW dbo.V1
        AS
        SELECT * FROM dbo.T1;
        GO
        -- 查看视图
        SELECT * FROM dbo.V1;
        GO
        /*
        col1        col2
        ----------- -----------
        1           2
        */
        --修改表架构
        ALTER TABLE dbo.T1 ADD col3 INT;
        GO
        --再次查看视图
        SELECT * FROM dbo.V1;
        GO
        /*
        col1        col2
        ----------- -----------
        1           2
        */
        --发现修改后的结构没有出现在眼前,刷新视图
        EXEC sp_refreshview 'dbo.V1';
        GO
        --再次查看
        SELECT * FROM dbo.V1;
        GO
        /*
        col1        col2        col3
        ----------- ----------- -----------
        1           2           NULL
        */
     ------------这里分享个一次刷新所有视图的代码(书上)-----------
     --刷新所有视图
        SELECT N'EXEC sp_refreshview '
             + QUOTENAME(VIEW_NAME, '''') + ';' AS cmd
        FROM (SELECT QUOTENAME(TABLE_SCHEMA)
               + N'.' + QUOTENAME(TABLE_NAME) AS VIEW_NAME
             FROM INFORMATION_SCHEMA.VIEWS) AS V
        WHERE OBJECTPROPERTY(OBJECT_ID(VIEW_NAME), 'IsSchemaBound') = 0;
        GO

#15


mac强大

#16


学习

#17


提醒:表修改后,视图不会自动更新列!学习, 之前也发现这个问题了,早看到MAC的帖子就好了,害我每个视图都手工去刷新

#18


sp_refreshview.
这个书上有说的。

#19


引用 3 楼 liangck 的回复:
sp_refreshview.

同意,可能有时候要刷新才看得到的,

#20


SELECT N'EXEC sp_refreshview '
             + QUOTENAME(VIEW_NAME, '''') + ';' AS cmd
        FROM (SELECT QUOTENAME(TABLE_SCHEMA)
               + N'.' + QUOTENAME(TABLE_NAME) AS VIEW_NAME
             FROM INFORMATION_SCHEMA.VIEWS) AS V
        WHERE OBJECTPROPERTY(OBJECT_ID(VIEW_NAME), 'IsSchemaBound') = 0;
        GO


这个要收藏下,哈哈

#21


学习

#22


学习

#23


up

#1


学习

#2


为啥啊 我也遇到过 

凡是试图中 select  * 的都会这样啊

#3


sp_refreshview.

#4


学习

#5


必须再执行一次
alter view v_table1 as select * from table1

select * from v_table1
才会返回修改后的表结果

#6


学习.

#7


对啊 我上次是在表中增加了一列 结果在视图中查不到 
引用 5 楼 cxmcxm 的回复:
必须再执行一次
SQL codealterview v_table1asselect*from table1
select * from v_table1
才会返回修改后的表结果

#8



if object_id('table1') is not null drop table table1
go
create table table1 (id int,fname varchar(10))
go
insert into table1 (id,fname)
select 1,'a'
union select 2,'b'
union select 3,'c'
union select 4,'d'
go
create view v_table1 
as
select * from table1
go 

select * from v_table1
go 
--修改表结构,增加列
alter table table1 add ps varchar(10) default('a') --增加列后,视图不会更新
go

--查看:
select * from table1
select * from v_table1
go 

#9


学习

#10


增加列,也许不会.这个有待测试.

如果只是更改数据,肯定会.

#11


至少我这出现过
引用 10 楼 dawugui 的回复:
增加列,也许不会.这个有待测试.

如果只是更改数据,肯定会.

#12


..

#13


create table tb(id int,name varchar(10))
go
create view V
as 
select * from tb
go

select * from v
/*
id          name       
----------- ---------- 

(所影响的行数为 0 行)
*/
alter table tb
add  name2 varchar(2)
go


select * from v
/*
id          name       
----------- ---------- 

(所影响的行数为 0 行)
*/
drop table tb
drop view v

#14


其实我再博客里面说过的
sp_refreshview 刷新下视图就可以了
视图刷新的问题 sp_refreshview
    有时候你会发现当你修改基础表的结构后,视图并没有跟着变,解决的方法就是修改后立即进行视图的刷新.特别是你试图出现select *的时候
        USE tempdb;
        GO
        IF OBJECT_ID('dbo.V1') IS NOT NULL
          DROP VIEW dbo.V1;
        GO
        IF OBJECT_ID('dbo.T1') IS NOT NULL
          DROP TABLE dbo.T1;
        GO
        
        CREATE TABLE dbo.T1(col1 INT, col2 INT);
        INSERT INTO dbo.T1(col1, col2) VALUES(1, 2);
        GO
        --建立视图
        CREATE VIEW dbo.V1
        AS
        SELECT * FROM dbo.T1;
        GO
        -- 查看视图
        SELECT * FROM dbo.V1;
        GO
        /*
        col1        col2
        ----------- -----------
        1           2
        */
        --修改表架构
        ALTER TABLE dbo.T1 ADD col3 INT;
        GO
        --再次查看视图
        SELECT * FROM dbo.V1;
        GO
        /*
        col1        col2
        ----------- -----------
        1           2
        */
        --发现修改后的结构没有出现在眼前,刷新视图
        EXEC sp_refreshview 'dbo.V1';
        GO
        --再次查看
        SELECT * FROM dbo.V1;
        GO
        /*
        col1        col2        col3
        ----------- ----------- -----------
        1           2           NULL
        */
     ------------这里分享个一次刷新所有视图的代码(书上)-----------
     --刷新所有视图
        SELECT N'EXEC sp_refreshview '
             + QUOTENAME(VIEW_NAME, '''') + ';' AS cmd
        FROM (SELECT QUOTENAME(TABLE_SCHEMA)
               + N'.' + QUOTENAME(TABLE_NAME) AS VIEW_NAME
             FROM INFORMATION_SCHEMA.VIEWS) AS V
        WHERE OBJECTPROPERTY(OBJECT_ID(VIEW_NAME), 'IsSchemaBound') = 0;
        GO

#15


mac强大

#16


学习

#17


提醒:表修改后,视图不会自动更新列!学习, 之前也发现这个问题了,早看到MAC的帖子就好了,害我每个视图都手工去刷新

#18


sp_refreshview.
这个书上有说的。

#19


引用 3 楼 liangck 的回复:
sp_refreshview.

同意,可能有时候要刷新才看得到的,

#20


SELECT N'EXEC sp_refreshview '
             + QUOTENAME(VIEW_NAME, '''') + ';' AS cmd
        FROM (SELECT QUOTENAME(TABLE_SCHEMA)
               + N'.' + QUOTENAME(TABLE_NAME) AS VIEW_NAME
             FROM INFORMATION_SCHEMA.VIEWS) AS V
        WHERE OBJECTPROPERTY(OBJECT_ID(VIEW_NAME), 'IsSchemaBound') = 0;
        GO


这个要收藏下,哈哈

#21


学习

#22


学习

#23


up