查找所有引用查看(Find All References to View)

2019-07-20 11:27发布

我有不同的数据库,以及如何确保我删除,是真正孤立的东西(在这种情况下图)。 是正确的SQL是使用:

SELECT r.routine_name, 
       r.routine_definition
  FROM INFORMATION_SCHEMA.ROUTINES r
 WHERE r.routine_definition LIKE '%my_view_name%' 

它的问题是,这些引用不会在存储过程中拿起声明,我不知道还有什么。

我发现SO问题我会记住的,但它没有任何帮助。 这个:

SELECT t.*
  FROM SYSCOMMENTS t
 WHERE CHARINDEX('my_view_name', t.text) > 0

...接近。 我得到的存储过程,我知道是使用视图的身体,但我遇到了麻烦的实际过程名。

Answer 1:

你只有一个选择。

select
    object_name(m.object_id), m.*
from
    sys.sql_modules m
where
    m.definition like N'%my_view_name%'

syscomments和INFORMATION_SCHEMA.ROUTINES具有为nvarchar(4000)列。 所以,如果“myViewName”是在3998位置使用,也不会被发现。 syscomments中并有多条线路,但例程截断。



Answer 2:

你的方法是不完全正确。 阅读这篇文章:

http://www.mssqltips.com/tip.asp?tip=1294

如果另一种观点认为使用这种观点你的方法将不会返回任何结果。

SQL Server 2008中具有特殊的视图(sys.dm_sql_referencing_entities),这里并不容易。



Answer 3:

我不知道,但我想你可以使用这样的事情,如果你的观点在一些存储过程使用

SELECT *  
FROM syscomments c  
INNER JOIN sysobjects o ON c.id =o.id 
WHERE text LIKE '%my_view_name%' AND xtype ='p'


文章来源: Find All References to View