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

时间:2010-08-20 18:27:01

标签: sql-server tsql testing stored-procedures

我们的表架构与我们的视图架构不同步存在问题。我想知道如何有一个存储过程(对于Sql Server)获取数据库中的所有视图,并通过select *

执行每个视图

这是我想象的(伪):


声明x
设置x =从sysobjects中选择对象,其中object = view

x中的foreach视图 sp_execute'select * from view'


然后我们可以进行自动测试,每晚调用它。 SqlException表示某些内容不同步。

3 个答案:

答案 0 :(得分:4)

应该在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

我主要关注你问题的一部分,另见how to make sure that the view will have the underlying table changes by using sp_refreshview

答案 1 :(得分:2)

我真的建议您使用WITH SCHEMABINDING来防止这种情况发生。

或至少在循环中使用sp_refreshview。

SELECT * FROM view不可靠:如何知道输出是否正确?

答案 2 :(得分: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