SQL Server为什么必须在表更改后刷新视图

时间:2015-02-17 03:13:26

标签: sql sql-server sql-server-2008-r2 views

这个问题来自我以前的帖子/解决方案:

adding a field somehow effects a views results

IMO值得拥有自己的职位。使用SQL Server 2008 R2。

为什么在将列添加到视图中引用的表后,我必须刷新视图?虽然不是直接需要回答这个帖子/问题,但我的特定场景的场景/行为将在上面链接的帖子中解释。

我不是观点的忠实粉丝。我很难创建它们,说实话,我正在使用我最初没写过的代码。让我们假设您有70多个视图,您最初没有写过,因此每次添加数据库列时都不知道哪些视图需要刷新。我应该能够随时随地添加任何列表,而不会产生任何影响。业务部门可以提出任何类型的更改请求,这些更改可能需要随时添加任意数量的字段。

当然还有另一种方法吗?

1 个答案:

答案 0 :(得分:5)

使用动态管理视图来识别哪些视图受到表更改的影响,然后遍历受影响视图的结果以使用动态sql来调用sp_refreshviewhttps://msdn.microsoft.com/en-us/library/ms187821(v=sql.105).aspx

如果您愿意,可以使用以下快速脚本来修改存储过程:

DECLARE @TableName VARCHAR(500) = 'dbo.Accounts'

DECLARE @ViewsToUpdate TABLE (ViewName VARCHAR(500))
    INSERT @ViewsToUpdate
        SELECT
            Views.TABLE_SCHEMA + '.' + Views.TABLE_NAME
        FROM INFORMATION_SCHEMA.TABLES [Views]
            INNER JOIN sys.dm_sql_referencing_entities(@TableName, 'OBJECT') DependingViews
                ON DependingViews.referencing_schema_name = Views.TABLE_SCHEMA
                    AND DependingViews.referencing_entity_name = Views.TABLE_NAME
        WHERE [Views].TABLE_TYPE = 'View'

WHILE EXISTS (SELECT * FROM @ViewsToUpdate) BEGIN
    DECLARE @ViewName VARCHAR(500) = (SELECT TOP 1 ViewName FROM @ViewsToUpdate)
    DECLARE @Sql NVARCHAR(1000) = 'EXEC sp_refreshview ''' + @ViewName + ''''
    EXEC sys.sp_executesql @Sql
    DELETE @ViewsToUpdate WHERE ViewName = @ViewName
END