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

为了testing目的,我创build了一个开发环境表,有几个sp正在修复这个表。 现在我必须删除这个表格,并且确定所有引用这个表格的sp。 我很难find所有sp的列表。 请通过假设表名是'x'和数据库是sql server 2005来build议一些查询。

SELECT Name FROM sys.procedures WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%' 

顺便说一句 – 这是这种types的问题一个方便的资源: http : //msdn.microsoft.com/en-us/library/ms345522%28v=SQL.90%29.aspx

以下在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 

一个非查询的方法是使用Sql Server Management Studio。

find表格,右键单击并select“查看依赖关系”。

编辑

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

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

 EXEC sp_depends @objname = N'TableName'; 

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

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

下面的查询是只为表格而不是列的工作

 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 
 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>%' 

请记住,这也会调出表名在注释中的SP,或者表名是另一个正在使用的表名的子string。 例如,如果您有名为“test”和“test_2”的表,并且您尝试使用“test”searchSP,那么您将得到两者的结果。

 SELECT DISTINCT OBJECT_NAME(OBJECT_ID), object_definition(OBJECT_ID) FROM sys.Procedures WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%' GO 

这将工作,如果你不得不提到表名。