SQL Server如何从数据库所有存储过程中查找指定插入值?
在SQL Server所有存储过程中查找指定表指定列的插入值
通过系统视图读取存储过程的完整定义,结合字符串匹配即可定位所有符合要求的插入逻辑和对应值。不要使用旧版syscomments视图,该视图会拆分超长存储过程文本导致匹配遗漏,推荐使用sys.sql_modules视图或OBJECT_DEFINITION函数读取完整定义。
可直接复用的查询脚本
以下脚本适配示例中查询[dbo].[Log]表[number]列插入值的场景,修改WHERE条件里的表名、列名即可适配其他查询需求:
SELECT SCHEMA_NAME(o.schema_id) AS 存储过程所属架构, OBJECT_NAME(sm.object_id) AS 存储过程名称, -- 截取VALUES后对应列的插入值 LTRIM(RTRIM(SUBSTRING( sm.definition, val_start_pos, CHARINDEX(')', sm.definition, val_start_pos) - val_start_pos ))) AS 对应列插入值 FROM sys.sql_modules sm INNER JOIN sys.objects o ON sm.object_id = o.object_id CROSS APPLY ( SELECT PATINDEX('%INSERT INTO%[Log]%([number])%VALUES%(%', sm.definition) + LEN('VALUES (') AS val_start_pos ) pos WHERE o.type = 'P' -- 仅筛选存储过程对象 AND sm.definition LIKE '%INSERT INTO%[Log]%([number])%VALUES%' -- 匹配目标表、目标列的插入逻辑 ORDER BY 存储过程名称
针对给出的3个测试存储过程,执行上述脚本将返回如下结果,和预期完全一致:
| 存储过程所属架构 | 存储过程名称 | 对应列插入值 |
|---|---|---|
| dbo | sp_1 | 1 |
| dbo | sp_2 | 2 |
| dbo | sp_3 | 4 |

使用注意事项
- 如果存储过程使用
WITH ENCRYPTION加密,上述方法无法读取存储过程定义,需要先完成解密才能查询 - 上述脚本适配
INSERT ... VALUES (常量)的写法,如果是INSERT ... SELECT、插入值为变量/函数表达式、多列插入、多行VALUES的场景,需要调整字符串截取的匹配规则 - 匹配规则默认兼容换行、多余空格、表名/列名带方括号的写法,如果存在别名、schema省略等写法,需要对应调整
LIKE匹配的模板
内容的提问来源于stack exchange,提问作者HyunM
相关产品推荐
相关产品推荐

