【问题标题】:How to identify all stored procedures referring a particular table如何识别引用特定表的所有存储过程
【发布时间】:2011-11-08 11:40:09
【问题描述】:

我在开发环境中创建了一个表用于测试目的,并且很少有 sp 正在重新定义该表。现在我必须删除这个表以及识别所有引用这个表的 sp。我很难找到所有 sp 的列表。请通过假设表名是“x”和数据库是 sql server 2005 来建议一些查询。

【问题讨论】:

标签: sql tsql sql-server-2005


【解决方案1】:
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

顺便说一句——对于这类问题,这里有一个方便的资源:Querying the SQL Server System Catalog FAQ

【讨论】:

  • 通过访问INFORMATION_SCHEMA.ROUTINES 上的ROUTINE_DEFINITION 是否有任何理由这样做?
  • @Marie -- SQL-Server 2005 (AFAIK) 没有。
  • 问题,当被引用的对象被引用inside时,这个解决方案会找到被引用的对象吗?喜欢,set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
  • @Jeff.Clark -- 有一个简单的方法可以找到 :-) -- 但是是的,它直接搜索过程的文本,所以它会找到。
  • 是的,是的 :) 我需要一段时间来设置测试,我只是在寻找一个懒惰/简单的答案 :)
【解决方案2】:

以下适用于 SQL2008 及更高版本。提供存储过程和函数的列表。

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name

【讨论】:

  • OP 需要 SQL-Server-2005 的答案
  • 出于某种原因,这对我不起作用。它返回 0 行。
  • 它可能不适用于 SQL Server 2005,但我很高兴找到它,因为这是 SQL Server“现代”版本的正确答案。
【解决方案3】:

有时上面的查询不会给出正确的结果,有内置的存储过程可用于获取表依赖项:

EXEC sp_depends @objname = N'TableName';

【讨论】:

  • 对我来说,这显示了触发器和视图,但没有显示存储过程。
  • 注意:我在可以访问表但不能访问存储过程的系统上运行此程序,因此存储过程当然没有显示在结果中。
【解决方案4】:

一种非查询方式是使用 Sql Server Management Studio。

找到表格,右键单击并选择“查看依赖项”。

编辑

但是,正如评论者所说,它不是很可靠。

【讨论】:

  • 在 2005 年,如果对象没有按正确的顺序创建,则依赖关系信息是不可靠的。
  • 正如@Martin Smith 指出的那样,将创建一个引用不存在对象的存储过程,尽管有警告,但不会将条目放在 sysdepends 中。同样,对于引用外部数据库中的表的存储过程也是如此:任何一个数据库中的 sysdepends 中都没有任何条目。另一个特性是删除/重新创建表或视图会破坏依赖链。这些...err...特性使 SQL Server 的依赖跟踪几乎毫无用处。
【解决方案5】:

以下查询将获取所有存储过程名称以及这些 SP 的相应定义

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'

【讨论】:

    【解决方案6】:

    在管理工作室中,您只需右键单击表格并单击“查看依赖项”

    您可以看到与您的表有依赖关系的对象列表:

    【讨论】:

      【解决方案7】:
      SELECT
          o.name
      FROM
          sys.sql_modules sm
      INNER JOIN sys.objects o ON
          o.object_id = sm.object_id
      WHERE
          sm.definition LIKE '%<table name>%'
      

      请记住,这也会出现表名在 cmets 中或表名是正在使用的另一个表名的子字符串的 SP。例如,如果您有名为“test”和“test_2”的表,并且您尝试使用“test”搜索 SP,那么您将获得两者的结果。

      【讨论】:

      • 以这种方式查询syscomments 对于长过程来说是不可靠的,因为它将定义拆分为跨多行的 4000 个字符块。 sys.sql_modules 避免了这种情况。
      • 好点。我已将其更新为使用 sys.sql_modules。
      • syscmets 在我对同一问题的十几个答案中的每一个都被揭穿了stackoverflow.com/…
      【解决方案8】:

      以下查询仅在搜索表上的依赖项而不是列上的依赖项时有效:

      EXEC sp_depends @objname = N'TableName';
      

      但是,如果您想搜索各种依赖项,以下查询是最佳选择,它不会遗漏任何内容。它实际上提供了比要求更多的信息。

       select distinct
              so.name
              --, text 
        from 
             sysobjects so, 
             syscomments sc 
        where 
           so.id = sc.id 
           and lower(text) like '%organizationtypeid%'
        order by so.name
      

      【讨论】:

      • 对我来说,在 SSMS 2014 上针对 SQL Server 12.0 上的数据库运行时没有返回任何内容)
      【解决方案9】:
      SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
      object_definition(OBJECT_ID)
      FROM sys.Procedures
      WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'
      
      GO
      

      如果您必须提及表名,这将起作用。

      【讨论】:

        【解决方案10】:

        你基本上有两个选择:

        ----选项1

        SELECT DISTINCT so.name
        FROM syscomments sc
        INNER JOIN sysobjects so ON sc.id=so.id
        WHERE sc.TEXT LIKE '%tablename%'
        

        ----选项2

        SELECT DISTINCT o.name, o.xtype
        FROM syscomments c
        INNER JOIN sysobjects o ON c.id=o.id
        WHERE c.TEXT LIKE '%tablename%'
        

        这两个查询将为您提供所有引用您想要的表的存储过程。此查询依赖于 2 个 sys 表,它们是 sysobjects 和 syscmets。 sysobjects 是存储所有数据库对象名称的地方,包括存储过程。

        syscmets 包含所有过程的文本。

        如果您查询: 从系统中选择 *

        您将拥有一个包含 id 的表,该表是到 sysobjects 表的映射,其中存储过程中包含的文本作为最后一列。

        【讨论】:

          【解决方案11】:

          如果你使用 Azure SQL / Synapse Anlaytics,这个有用的查询也可以工作

          SELECT DISTINCT o.name AS Object_Name,o.type_desc
          FROM sys.sql_modules m
          INNER JOIN sys.objects o
          ON m.object_id=o.object_id
          WHERE m.definition Like '%Table_Name%'
          

          【讨论】:

            【解决方案12】:

            试试这个

               SELECT DISTINCT so.name
                FROM syscomments sc
                INNER JOIN sysobjects so ON sc.id=so.id
                WHERE sc.TEXT LIKE '%your table name%'
            

            【讨论】:

              【解决方案13】:
              SELECT DISTINCT o.name, o.xtype
              FROM syscomments c
              INNER JOIN sysobjects o ON c.id=o.id
              WHERE c.TEXT LIKE '%tablename%'
              

              【讨论】:

                猜你喜欢
                • 2017-07-10
                • 1970-01-01
                • 2018-01-09
                • 2013-11-01
                • 1970-01-01
                • 1970-01-01
                • 2020-12-27
                • 2011-06-11
                • 1970-01-01
                相关资源
                最近更新 更多