2010-08-20 85 views
3

我們的表模式與視圖模式不同步時出現問題。我想知道我怎麼能有一個存儲過程(對於SQL Server)是獲取數據庫中的所有意見,並執行通過每一個選擇*如何通過存儲過程執行數據庫中的所有視圖

這是我想象的(僞):


從系統對象

x聲明
集X =選擇對象,其中以x
sp_execute對象=視圖

的foreach視圖

'從視圖中選擇*' 0

然後,我們可以進行自動測試,每天晚上都會調用它。一個SqlException將表明某些內容不同步。

+0

你有什麼版本的SQL Server? – 2010-08-20 18:28:38

+0

當前正在運行2008 R2 – PAR 2010-08-20 18:34:00

+0

請問您有什麼特別的情況發生嗎?大多數情況是列名正在更改或者列正在被刪除,或者SELECT *沒有選擇新列或者什麼?請問這些意見的目的是什麼?他們只是作爲一個權限/抽象層,還是做額外的連接和其他業務對象組裝? – ErikE 2010-08-21 03:49:30

回答

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

+0

完美 - 謝謝 – PAR 2010-08-20 18:38:34

+0

雖然不可靠,但是...? – gbn 2010-08-20 19:23:52

+0

我特別回答了這個部分「我想知道如何獲得一個存儲過程(用於Sql Server),它可以獲取數據庫中的所有視圖,並通過select *」 – SQLMenace 2010-08-20 19:27:03

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 
+0

創建帶有1個字段的表,爲選擇該字段創建視圖,在表中重命名字段,執行您的查詢,獲得空結果集 - 不知道這是應該做什麼... 接受的解決方案給我我尋找的異常。 – PAR 2010-08-20 18:46:30

+0

@PAR - 是的,這將會丟失表格。只是看看是否可以調整掉落的列。在任何情況下'sp_refreshview'都會得到那些無需選擇所有內容的人 – 2010-08-20 18:48:22

2

我真的建議您使用WITH SCHEMABINDING來防止這種情況發生。

或者至少在循環中使用sp_refreshview。

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

相關問題