当你用*号的时候,隐患早就存在了。就像我刚才说的,当表结构变化的时候,我举个例子吧。 假设表A(ID,NAME) 有一个视图:create view test as select * from A 视图很少写,不知道有没有语法错误,就看个大概吧。 然后你用的时候insert into B(id,name) select * from test,这样是没问题的。 但是当你A表改变了。变成A(ID,NAME,VALUE)时,你的select * from test本来就出来3列了。插入到2列的表时就会报错,我相信Oracle、DB2、SQLServer2000、2008这些都不可能避免的。所以我才建议你不要用*号。这个东西刷新是没用的。
是吗,我的视图语句是这样的。select A.*,B.* from A INNER JOIN B on A.a_id = B.b_id.请问,在sqlserver2005如果视图只是查询语句,那么结果这么会少了个字段。还莫名其妙的类型转换错误
问题是为什么要刷新呢,视图不是个查询语句吗。难道sqlserver2005的视图做过特殊处理,比如对结构做过缓存??
假设表A(ID,NAME)
有一个视图:create view test as select * from A 视图很少写,不知道有没有语法错误,就看个大概吧。
然后你用的时候insert into B(id,name) select * from test,这样是没问题的。
但是当你A表改变了。变成A(ID,NAME,VALUE)时,你的select * from test本来就出来3列了。插入到2列的表时就会报错,我相信Oracle、DB2、SQLServer2000、2008这些都不可能避免的。所以我才建议你不要用*号。这个东西刷新是没用的。
正解!建议如果你视图有变化先drop再重新创建
在我的印象中,视图就一查询语句。这个问题打破了我以前的认识,所以我特地安装了一个oracle试了下,发现oracle确实没有这个问题,在oracle中视图就一sql语句,也就无所谓自不自动更新。 后来,发现oracle中有一种物化视图的概念,可能会发生这个问题