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

时间:2011-09-01 14:54:53

标签: sql tsql sql-server-2005

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

12 个答案:

答案 0 :(得分:198)

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

顺便说一句 - 这是一个方便的资源,可用于此类问题: Querying the SQL Server System Catalog FAQ

答案 1 :(得分:24)

以下适用于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

答案 2 :(得分:15)

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

找到该表,右键单击并选择“查看依赖关系”。

修改

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

答案 3 :(得分:14)

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

EXEC sp_depends @objname = N'TableName';

答案 4 :(得分:6)

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

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

答案 5 :(得分: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>%'

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

答案 6 :(得分:2)

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

GO

如果您必须提及表名,这将有效。

答案 7 :(得分:1)

在Management Studio中,您可以右键单击表格,然后单击“查看依赖项” enter image description here

您将看到与表具有依赖性的对象列表:enter image description here

答案 8 :(得分:0)

尝试

 select name from TableName
 where technologies in('reactjs', 'mysql', 'express')
 group by name
 having count(distinct technologies) > 2

答案 9 :(得分:0)

您基本上有2个选择:

----选项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和syscomments。 sysobjects是存储所有DB对象名称的位置,其中包括存储过程。

系统注释包含所有过程的文本。

如果您查询: 选择*来自系统注释

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

答案 10 :(得分:0)

如果您使用 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%'

答案 11 :(得分:-1)

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