如何查询所有更新特定列(如Student.name)的存储过程?
查询包含修改Student.name操作的存储过程
可以通过查询系统视图sys.all_sql_modules来定位这类存储过程,该视图存储了所有用户定义模块(包括存储过程)的SQL定义文本。
基础查询语句
SELECT sm.object_id, OBJECT_NAME(sm.object_id) AS procedure_name, sm.definition FROM [eUniversityManagement].[sys].[all_sql_modules] sm JOIN [eUniversityManagement].[sys].[objects] o ON sm.object_id = o.object_id WHERE o.type = 'P' -- 仅筛选存储过程 AND sm.definition LIKE '%UPDATE%Student%' AND sm.definition LIKE '%SET%Name =%'
关键说明
- 关联
sys.objects是为了精准定位存储过程(type = 'P'),避免误匹配视图、函数等其他数据库对象。 - 两个
LIKE条件分别匹配包含UPDATE Student的语句,以及对Name字段的赋值操作,以此锁定修改Student.name的逻辑。 - 若表名带架构前缀(如
dbo.Student),可将第一个LIKE条件调整为'%UPDATE%[dbo.]Student%';若字段名使用方括号(如[Name]),可将第二个条件改为'%SET%[Name] =%'。
兼容表别名的扩展查询
如果存储过程中使用表别名简化写法(如下例):
UPDATE s SET s.Name = @NewName FROM Student s WHERE s.ID = @ID
可以用以下查询覆盖这类场景:
SELECT sm.object_id, OBJECT_NAME(sm.object_id) AS procedure_name, sm.definition FROM [eUniversityManagement].[sys].[all_sql_modules] sm JOIN [eUniversityManagement].[sys].[objects] o ON sm.object_id = o.object_id WHERE o.type = 'P' AND ( -- 匹配直接UPDATE Student的情况 (sm.definition LIKE '%UPDATE%Student%SET%Name =%') -- 匹配使用别名的情况 OR (sm.definition LIKE '%UPDATE%[a-z]%SET%.Name =%' AND sm.definition LIKE '%FROM%Student%') )
内容的提问来源于stack exchange,提问作者henryloke
相关产品推荐
相关产品推荐

