美文网首页SQL server数据库
Sql Server-实用技巧-在所有存储过程中查询包含某字符串

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

作者: 柠檬正在努力 | 来源:发表于2020-04-11 17:58 被阅读0次

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

相关文章

网友评论

    本文标题:Sql Server-实用技巧-在所有存储过程中查询包含某字符串

    本文链接:https://www.haomeiwen.com/subject/hspumhtx.html