在SQL Server与Sybase中查找使用目标表的存储过程方法
查找SQL Server和Sybase中引用指定表的存储过程
SQL Server 操作方法
直接查询系统视图即可定位引用目标表的存储过程,以下是两种常用方案:
方案1:通过定义文本匹配
替换语句中的YourTableName为实际表名:
SELECT DISTINCT o.name AS ProcedureName, o.type_desc AS ObjectType FROM sys.sql_modules m JOIN sys.objects o ON m.object_id = o.object_id WHERE m.definition LIKE '%YourTableName%' AND o.type IN ('P', 'PC') -- P=常规存储过程,PC=CLR存储过程 ORDER BY ProcedureName;
方案2:通过依赖关系精准查询
此方法避免文本匹配的误判,需替换YourSchema.YourTableName为带架构的完整表名:
SELECT referencing_schema_name + '.' + referencing_entity_name AS ProcedureName, referencing_class_desc AS ObjectType FROM sys.dm_sql_referencing_entities ('YourSchema.YourTableName', 'OBJECT') WHERE referencing_class = 1 -- 仅查询对象类型依赖 AND referencing_class_desc = 'SQL_STORED_PROCEDURE' ORDER BY ProcedureName;
注意事项:
- 若表名是SQL关键字,需用方括号包裹,比如
[User] - 若存储过程是加密的,
sys.sql_modules.definition会返回NULL,只能依赖系统视图的关系排查
Sybase ASE 操作方法
Sybase ASE依赖sysobjects和syscomments系统表查询,替换语句中的YourTableName为实际表名:
SELECT DISTINCT o.name AS ProcedureName FROM sysobjects o JOIN syscomments c ON o.id = c.id WHERE c.text LIKE '%YourTableName%' AND o.type = 'P' -- 仅筛选存储过程 ORDER BY ProcedureName;
注意事项:
- Sybase中
syscomments会将长存储过程拆分为多条记录,必须用DISTINCT去重 - 同样,加密存储过程的
text字段无法读取,这种情况需依赖数据库内置的依赖追踪工具或手动排查
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

