gpt4 book ai didi

SQL Server 为什么表更改后必须刷新 View

转载 作者:行者123 更新时间:2023-12-02 19:21:06 25 4
gpt4 key购买 nike

这个问题来 self 之前的帖子/解决方案:

adding a field somehow effects a views results

在我看来,它值得拥有自己的职位。使用 SQL Server 2008 R2。

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

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

当然还有另一种方法吗?

最佳答案

使用动态管理 View 来确定哪些 View 受到表更改的影响,然后循环访问受影响 View 的结果,以使用动态 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

关于SQL Server 为什么表更改后必须刷新 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28554042/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com