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