Sql Server-实用技巧-在所有存储过程中查询包含某字符串的执行语句

下面直接放代码:
一、利用sysobjects表和syscomments表进行查询

SELECT Name
FROM sysobjects o, syscomments s
WHERE o.id = s.id
    AND text LIKE '%str%'
    AND o.xtype = 'P'

这里解释一下
sysobjects :在数据库内创建的每个对象(约束、默认值、日志、规则、存储过程等)在表中占一行。只有在 tempdb 内,每个临时对象才在该表中占一行。
sysobjects 表结构:

列名 数据类型 描述
name sysname 对象名,常用列
id int 对象标识号
xtype char(2) 对象类型。常用列。xtype可以是下列对象类型中的一种:
C = CHECK 约束
D = 默认值或 DEFAULT 约束
F = FOREIGN KEY 约束
L = 日志
FN = 标量函数
IF = 内嵌表函数
P = 存储过程
PK = PRIMARY KEY 约束(类型是 K)
RF = 复制筛选存储过程
S = 系统表
TF = 表函数
TR = 触发器
U = 用户表   
UQ = UNIQUE 约束(类型是 K)
V = 视图
X = 扩展存储过程

syscomments:包含数据库中每个视图、规则、默认值、触发器、CHECK 约束、DEFAULT 约束和存储过程的项。text 列包含原始的 SQL 定义语句。
syscomments 表结构:

列名 数据类型 描述
name sysname 对象名,常用列
id int 该文本适用的对象 ID
text nvarchar(4000) SQL 定义语句的实际文本。
解码后的表达式的语义等同于原始文本,但是没有语法保证。
例如,已解码的表达式中删除了空格。

返回所有出现过该字符串的存储过程名:

Name
1 Table1
2 Table2
2 Table2

所以这个查询的意思是,对两个系统表进行联查,查找关键条件是SQL 定义语句的实际文本中包含‘str‘的字符串的、对象类型为’P‘的对象。

这在进行例如一些提醒消息的str从哪个存储过程拼接出来的这些情况下会非常方便,不需求一个个打开存储过程排查

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。