如何识别引用特定表的所有存储过程

DJa*_*Jay 117 sql t-sql sql-server-2005

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

Cha*_*ins 225

SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'
Run Code Online (Sandbox Code Playgroud)

BTW - 这是一个方便的资源,用于此类问题:查询SQL Server系统目录常见问题解答

  • 有没有理由这样做才能访问`INFORMATION_SCHEMA.ROUTINES`上的`ROUTINE_DEFINITION`? (3认同)
  • 问题,当在字符串的 *inside* 中引用这些对象时,此解决方案是否会找到被引用的对象?比如,`set @Query = “SELECT * FROM Object_I_Need_To_Find_References...”;` (2认同)
  • @Jeff.Clark - 有一个简单的方法可以找到:-) - 但是,是的,它直接搜索过程的文本,所以它会找到它。 (2认同)
  • 是啊是啊:)这需要我一段时间来设置测试,我只是在寻找一个懒惰/简单的答案:) (2认同)

Guy*_*ton 26

以下适用于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
Run Code Online (Sandbox Code Playgroud)

  • OP 需要 SQL-Server-2005 的答案 (2认同)

Han*_*ing 17

非查询方式是使用Sql Server Management Studio.

找到该表,右键单击并选择"查看依赖关系".

编辑

但是,正如评论者所说,这不是很可靠.

  • 在2005年,如果没有以正确的顺序创建对象,则依赖关系信息是不可靠的. (4认同)
  • 正如@Martin Smith所指出的,引用不存在的对象的存储过程将被创建,尽管有一个警告,但不会将条目放在sysdepends中.此外,对于引用外部数据库中的表的存储过程也是如此:在任一数据库的sysdepends中都没有输入任何条目.Antoher的特性是删除/重新创建表或视图会破坏依赖关系链.这些...错误...功能使SQL Server的依赖关系跟踪几乎没用. (3认同)

小智 15

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

EXEC sp_depends @objname = N'TableName';
Run Code Online (Sandbox Code Playgroud)

  • 注意:我在可以访问表但不能访问存储过程的系统上运行它,所以当然存储过程没有出现在结果中。 (2认同)

Dee*_*ari 6

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

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


Tom*_*m H 5

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>%'
Run Code Online (Sandbox Code Playgroud)

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

  • 对于同一个问题我的十几个答案中的每一个都已经揭穿了syscomments http://stackoverflow.com/search?tab=votes&q=user%3a27535%20syscomments (3认同)
  • 以这种方式查询`syscomments`对于长程序来说是不可靠的,因为它将定义分成多行中的4000个字符块.`sys.sql_modules`避免这种情况. (2认同)

小智 5

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

EXEC sp_depends @objname = N'TableName';
Run Code Online (Sandbox Code Playgroud)

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

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


nzr*_*tmn 5

在管理工作室中,您可以右键单击表格并单击“查看依赖项” 在此处输入图片说明

您可以看到与您的表有依赖关系的对象列表:在此处输入图片说明