如何通过存储过程执行数据库中的所有视图

4
我们的表结构与视图结构不同步,我想知道如何编写一个存储过程(针对Sql Server),以获取数据库中的所有视图,并通过select *执行每个视图。
以下是我设想的代码(伪代码):
声明x
设置x = 从sysobjects中选择对象,其中对象为视图
对于x中的每个视图
执行sp_execute 'select * from view'

我们可以编写一个自动化测试,每晚调用此存储过程。如果出现SqlException,则表示有不同步的情况。

你使用的 SQL Server 版本是哪个? - Philip Kelley
请问,具体出了什么问题?是列名在改变还是列被删除了?或者SELECT *没有获取到新的列,还是其他问题?另外,可以问一下视图的目的是什么?它们只作为权限/抽象层存在,还是进行了其他业务对象组装和连接操作? - ErikE
3个回答

5

应该能在2000年及以后的版本中正常工作。

select quotename(table_schema) +'.' + quotename(table_name) as ViewNAme,
 identity(int,1,1) as ID
  into #test
  from information_schema.tables
 where table_type = 'view'


declare @Loopid int,@MaxID int


select @LoopID =1,@MaxID =MAX(id) 
from #test

declare @ViewName varchar(100)

while @LoopID <= @MaxID
begin

select @ViewName = ViewNAme 
from #test
where id = @LoopID

exec ('select top 1 * from ' + @ViewName)
set @LoopID = @LoopID + 1
end

drop table #test

我主要关注你问题的一部分,另外请参考如何使用sp_refreshview确保视图在底层表更改时仍然存在

虽然不太可靠,是吧...? - gbn
我特别回答了这部分内容:“我想知道如何编写一个存储过程(针对Sql Server),以获取数据库中的所有视图,并通过select *执行每个视图。” - SQLMenace
1
@SQLMenace:它解决了问题吗?难道我们不应该进行教育和改进吗? - gbn
好的..已添加刷新视图链接 - SQLMenace
请在该动态 SQL 中加入 TOP 1。 - ErikE

2
我真的建议您使用WITH SCHEMABINDING来防止这种情况发生。
或者至少在循环中使用sp_refreshview。 SELECT * FROM view不可靠:您如何知道输出是否正确?

0
在SQL 2008中,您可以使用以下方法检测未解决的依赖关系,而无需实际从视图中进行选择。
SELECT * 
FROM sys.views v
JOIN sys.sql_expression_dependencies e ON e.referencing_id = v.object_id
and  referenced_id is null

创建了一个只有1个字段的表,创建了一个选择该字段的视图,在表中重命名了该字段,执行了您的查询,得到了一个空结果集 - 不确定这应该做什么...接受的解决方案给了我我正在寻找的异常。 - PAR
@PAR - 是的,这将会删除表。只是想看看是否可以调整来删除列。无论如何,使用 sp_refreshview 可以获取到这些视图,而不必选择所有内容。 - Martin Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接