当前位置: 代码迷 >> Sql Server >> 视图小疑点
  详细解决方案

视图小疑点

热度:169   发布时间:2016-04-24 08:44:24.0
视图小问题

有这样一个例子。

CREATE TABLE T1 (a INT ,b INT)INSERT INTO dbo.T1        ( a, b )VALUES  ( 1,  2   ),(3,4)goCREATE VIEW V1 AS SELECT * FROM dbo.T1 GODROP TABLE T1 ;GOCREATE TABLE T1 (c INT ,d INT)GOINSERT INTO dbo.T1        ( c, d )VALUES  ( 1,  2   ),(3,4)

然后再查询视图, 返回的栏位是如何呢?

a b
----------- -----------
1 2
3 4

这是因为虽然修改了表结构,但是视图里面的结构还没有刷新,在视图里面保存的列还是a,b 两列,所以就查出来还是 a,b 两列

 

SELECT name,column_id FROM sys.columns WHERE object_id = object_id('V1')name  column_id--------------------------- -----------a                                1b                                 2

 

PS:所以,如果修改了表,请留意相关视图是否正常,也要小心表结构尽量不要动

 

1楼剑走江湖
SQL Server中,视图最好使用引用数据表的具体列,尽量不要使用SELECT *。如果视图中使用了SELECT *且其引用的数据表的结构变化(有字段列删除或新增),可以使用系统存储过程sys.sp_refreshview,参考T-SQL代码如下:EXEC sys.sp_refreshview @viewname = N#39;#39; -- nvarchar(776)
Re: 神崎橙
@剑走江湖,谢谢指导,一般来说用select * 这种写法是很危险的,平时也不允许这样做(*^__^*)
  相关解决方案