相信大家也都遇到过,当修改了表结构后,与之相关的视图就会有问题,这是因为我们没有刷新视图的缘故,为什么表结构变化后要刷新视图? ,分享一下解决此类问题的方法:
1.重新修改相关视图,将Alter脚本重新执行即可,不需要改动代码。
2.执行sp_refreshview命令,刷新视图依赖。重点介绍一上这种方法。
(1)sp_refreshview 视图名 --刷新单个视图
(2)刷新所有视图
--刷新所有视图
declare @ViewName varchar(250)
declare @i int
set @i=0
declare #_cursor cursor for
select name from sysobjects where type='V'
open #_cursor
fetch next from #_cursor into @viewname
while @@fetch_status=0
begin
print '成功刷新视图: '+ @viewname
exec sp_refreshview @viewname
set @i= @i +1
fetch next from #_cursor into @viewname
end
close #_cursor
deallocate #_cursor
print '完成'
print '共成功刷新' + convert(varchar(10),@i) + '个视图'
(3)刷新与表table1相关的所有视图
--引自msdn
USE AdventureWorks;
GO
SELECT DISTINCT 'EXEC sp_refreshview ''' + name + ''''
FROM sys.objects so INNER JOIN sys.sql_dependencies sd
ON so.object_id = sd.object_id
WHERE type = 'V'
AND sd.referenced_major_id = object_id('table1')
以上三种方法,个人更加推荐第三种,但每三种目前的方法只能把与表相关的视图都找出来,怎么执行?请高手补充,如果是把查询结果复制出来单个执行,效率太低。
补充:第三种方法
go
declare @sql nvarchar(max) select distinct @sql=isnull(@sql,';')+ 'EXEC sp_refreshview ''' + name + ''''
FROM sys.objects so INNER JOIN sys.sql_dependencies sd
ON so.object_id = sd.object_id
WHERE type = 'V'
AND sd.referenced_major_id = object_id('table1')
exec(@sql)