我有不同的数据库,以及如何确保我删除,是真正孤立的东西(在这种情况下图)。 是正确的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
...接近。 我得到的存储过程,我知道是使用视图的身体,但我遇到了麻烦的实际过程名。
你只有一个选择。
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中并有多条线路,但例程截断。
你的方法是不完全正确。 阅读这篇文章:
http://www.mssqltips.com/tip.asp?tip=1294
如果另一种观点认为使用这种观点你的方法将不会返回任何结果。
SQL Server 2008中具有特殊的视图(sys.dm_sql_referencing_entities),这里并不容易。
我不知道,但我想你可以使用这样的事情,如果你的观点在一些存储过程使用
SELECT *
FROM syscomments c
INNER JOIN sysobjects o ON c.id =o.id
WHERE text LIKE '%my_view_name%' AND xtype ='p'