代码之家  ›  专栏  ›  技术社区  ›  OMG Ponies

查找所有要查看的引用

  •  6
  • OMG Ponies  · 技术社区  · 15 年前

    我有各种各样的数据库,以及确定要删除的内容(本例中的视图),这些内容确实是孤立的。是否使用正确的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
    

    ……接近了。我得到了存储过程的主体,我知道它正在使用视图,但是我在获取实际的过程名称时遇到了困难。

    3 回复  |  直到 8 年前
        1
  •  21
  •   gbn    15 年前

    你只有一个选择。

    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)列。因此,如果在3998位置使用“myviewname”,将找不到它。syscomments确实有多行,但例程会截断。

        2
  •  1
  •   LukLed    15 年前

    你的方法不完全正确。阅读本文:

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

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

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

        3
  •  1
  •   Echilon Mafarnakus    8 年前

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

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