这个问题来自我以前的帖子/解决方案:
adding a field somehow effects a views results
IMO值得拥有自己的职位。使用SQL Server 2008 R2。
为什么在将列添加到视图中引用的表后,我必须刷新视图?虽然不是直接需要回答这个帖子/问题,但我的特定场景的场景/行为将在上面链接的帖子中解释。
我不是观点的忠实粉丝。我很难创建它们,说实话,我正在使用我最初没写过的代码。让我们假设您有70多个视图,您最初没有写过,因此每次添加数据库列时都不知道哪些视图需要刷新。我应该能够随时随地添加任何列表,而不会产生任何影响。业务部门可以提出任何类型的更改请求,这些更改可能需要随时添加任意数量的字段。
当然还有另一种方法吗?
答案 0 :(得分:5)
使用动态管理视图来识别哪些视图受到表更改的影响,然后遍历受影响视图的结果以使用动态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