【问题标题】:Find All References to View查找所有要查看的参考资料
【发布时间】:2009-10-01 19:52:40
【问题描述】:

我有各种数据库,以及要确保我正在删除一些真正孤立的东西(在这种情况下是一个视图)。使用的 SQL 是否正确:

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

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

我找到了我记得的SO Question,但这也无济于事。这个:

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

...接近了。我得到了我知道正在使用视图的存储过程的主体,但我无法获取实际的过程名称。

【问题讨论】:

  • “sp_depends”没有帮助。我想你必须在每个数据库上运行它。

标签: sql sql-server sql-server-2005 tsql


【解决方案1】:

你只有一个选择。

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

syscmets 和 INFORMATION_SCHEMA.routines 有 nvarchar(4000) 列。因此,如果在位置 3998 处使用了“myViewName”,将找不到它。 syscmets 确实有多行,但 ROUTINES 会截断。

【讨论】:

    【解决方案2】:

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

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

    如果另一个视图使用此视图,您的方法将不会返回任何结果。

    SQL Server 2008 有特殊视图(sys.dm_sql_referencing_entities),这里没那么容易。

    【讨论】:

    • 如果要使用 syscmets 并获取对象名称:SELECT object_name(t.id),t.* FROM SYSCOMMENTS t WHERE CHARINDEX('V_MIEJSCE', t.text) > 0
    • @LukLed:我不想,只是想知道什么是最好用的。根据 gbn 的回答,不是。
    【解决方案3】:

    我不确定,但我想如果您的视图用于某些存储过程中,您可以使用类似的东西

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

    【讨论】:

    • @Neil:文本列被截断为第一个 4,000 个字符,因此如果您要查找的字符串不完全在 4,000 个字符的限制范围内,SQL 将返回假阴性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-03-11
    • 2011-03-14
    • 1970-01-01
    • 2011-02-17
    相关资源
    最近更新 更多