下面直接放代码:
一、利用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从哪个存储过程拼接出来的这些情况下会非常方便,不需求一个个打开存储过程排查