表模式更新后错误的列值SQL Server视图

时间:2015-05-06 15:46:31

标签: sql-server views alter-table

我总是问自己,为什么如果在SQL Server上有两个表,我创建一个这样的视图:

CREATE VIEW vw_MyView 
AS
SELECT T1.*, T2.ClientName FROM Table1 T1 inner join Table2 T2 on T1.ID_Client=T2.ID_Client

当我需要向表1添加字段时,视图显示值未命中?第一列的值显示在colunm 2上,依此类推!

这发生在我测试的每个版本的SQL Server上。任何人都可以告诉我为什么会发生这种情况以及如何解决这个问题?

这种行为给出了很大的问题,特别是派生的视图。 感谢

2 个答案:

答案 0 :(得分:6)

更新架构后,您应刷新依赖于架构的任何和所有视图的视图元数据:

EXEC sp_refreshview @viewName

@viewName变量保存视图的名称。您可以在脚本中使用此存储过程,该脚本可以获取依赖于表的视图,以便动态刷新它们,或者您可以旋转所有视图(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS)并调用存储过程在每一个观点上。

这样做的另一个好处是可以找到任何因架构更改而无效的视图并标记它们,因为它们会在调用SP时出错。

答案 1 :(得分:1)

接受的答案是肯定的(我也投票了)在更改表格后解决了这个问题。 对于我的环境,我更喜欢使用WITH SCHEMABINDING(请参阅https://msdn.microsoft.com/en-us/library/ms187956.aspx)来创建视图。这导致无法在选择视图时使用*,如此处所讨论的那样:Why is using '*' to build a view bad?当然也无法在不更改的情况下更改表的列(在大多数情况下:删除,重新创建视图

当更改表时,这当然更麻烦,但是这样在忘记在表更改后调用EXEC sp_refreshview(例如列删除)时就不会出现运行时错误,因为数据库强制您也要调整视图