SQL 服务器为什么我必须在 table 更改后刷新视图

SQL Server why must I refresh views after table changes

这个问题来自我之前 post/solution 的问题:

IMO 它值得拥有 post。使用 SQL Server 2008 R2。

为什么在向视图中引用的 table 添加列后必须刷新视图?虽然没有必要直接回答这个 post/question,但针对我的特定情况的 scenario/behavior 已在上面链接的 post 中进行了解释。

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

当然还有另一种方法吗?

使用动态管理视图确定哪些视图受到您的 table 更改的影响,然后遍历受影响视图的结果以使用动态 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