挑选出只依赖表的视图, 并得到相应的创建脚本

---------------- 测试表及视图 BEGIN ----------------
USE tempdb
GO
IF OBJECT_ID('dbo.t') IS NOT NULL
DROP TABLE dbo.t
GO
CREATE TABLE dbo.t(id INT PRIMARY KEY,userName NVARCHAR(20))
GO
IF OBJECT_ID('dbo.view_grand_father') IS NOT NULL
DROP VIEW dbo.view_grand_father
GO
IF OBJECT_ID('dbo.view_father') IS NOT NULL
DROP VIEW dbo.view_father
GO
IF OBJECT_ID('dbo.view_son') IS NOT NULL
DROP VIEW dbo.view_son
GO
IF OBJECT_ID('dbo.view_test') IS NOT NULL
DROP VIEW dbo.view_test
GO
CREATE VIEW dbo.view_son
AS
SELECT * FROM dbo.t
GO
CREATE VIEW dbo.view_father
AS
SELECT * FROM view_son
GO
CREATE VIEW dbo.view_grand_father
AS
SELECT * FROM view_father
GO
CREATE VIEW dbo.view_test
AS
SELECT * FROM view_son
UNION
SELECT * FROM dbo.t
GO
---------------- 测试表及视图 END ----------------

--1. 查出所有的视图的情况
SELECT v.name AS viewName,OBJECT_NAME(depid) depName,ISNULL((SELECT TOP 1 1 FROM sys.tables AS t WHERE t.[object_id]=s.depid),0) AS depTable,ISNULL((SELECT TOP 1 1 FROM sys.views AS v WHERE v.[object_id]=s.depid),0) AS depView 
FROM sys.[views] AS v INNER JOIN sys.sysdepends AS s ON v.[object_id]=s.id
WHERE s.depnumber=1
ORDER BY depTable DESC
/*
viewName depName		depTable depView
view_son	t			1			0
view_test	t			1			0
view_test	view_son	0			1
view_father	view_son	0			1
view_grand_father	view_father	0	1
*/

--2. 得到所有只依赖表的视图的脚本
;WITH cte AS (
	SELECT v.[object_id],0) AS depView 
	FROM sys.[views] AS v INNER JOIN sys.sysdepends AS s ON v.[object_id]=s.id
	WHERE s.depnumber=1	
)
select OBJECT_NAME(s.id) AS viewName,text 
from sys.syscomments AS s
WHERE s.id IN (
	SELECT a.object_id FROM cte a WHERE depTable=1 AND NOT EXISTS(
		SELECT * FROM cte b WHERE a.object_id=b.object_id AND b.depView=1	
	)
)
/*
viewName    text
view_son	CREATE VIEW dbo.view_son  AS  SELECT * FROM dbo.t  
*/
--余下就是多重依赖的视图, 略

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...