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

Mat*_*t41 6 sql sql-server views sql-server-2008-r2

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

以某种方式添加字段会影响视图结果

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

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

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

当然还有另一种方法吗?

Jas*_*n W 6

使用动态管理视图来识别哪些视图受到表更改的影响,然后循环访问受影响视图的结果以使用动态sql调用sp_refreshview(https://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
Run Code Online (Sandbox Code Playgroud)