在SQL Server数据库开发、维护及优化工作中,我们经常需要快速定位包含特定业务关键字的数据库对象,比如查找引用了某个业务字段的存储过程、检索包含特定关键字的数据表字段等。
直接手动逐对象排查效率极低,而SQL Server提供的系统视图可以高效完成这类批量检索需求。本文将深度解析两段实用SQL脚本,帮助你快速掌握通过系统视图批量查询数据库对象的核心技巧。
一、脚本整体业务场景
这两段脚本是SQL Server数据库运维高频工具,核心作用:
-
第一段:查找自定义存储过程中包含指定关键字techn_need的对象,同时获取存储过程的定义语句;
-
第二段:查找用户自定义数据表中,字段名包含指定关键字techn_need的表名、字段名及字段长度。
二、第一段脚本:检索含关键字的自定义存储过程
2.1 完整脚本
sql
-- 查询包含指定关键字的自定义存储过程
select
a.name, -- 存储过程名称
a.[type], -- 对象类型
b.[definition] -- 存储过程定义语句
from sys.all_objects a,sys.sql_modules b
where
a.is_ms_shipped=0 -- 过滤掉微软系统自带对象,只保留自定义对象
and a.object_id = b.object_id -- 关联对象ID,建立两张系统视图的关联关系
and a.[type] in ('P') -- 仅筛选存储过程
and b.definition like '%techn_need%' -- 定义中包含关键字techn_need
order by a.[name] asc; -- 按存储过程名称升序排序
2.2 核心系统视图解析
- sys.all_objects
数据库所有对象的基础视图,包含存储过程、表、视图、函数等所有对象的元数据,核心字段:
-
name:对象名称;
-
type:对象类型编码(P代表存储过程);
-
is_ms_shipped:标识是否为微软系统自带对象(0=自定义,1=系统对象);
-
object_id:对象唯一标识ID。
- sys.sql_modules
存储SQL对象定义文本的系统视图,所有可编程对象(存储过程、视图、函数等)的SQL代码都存储在definition字段中,通过object_id与其他系统视图关联。
2.3 脚本逻辑拆解
-
多表关联:通过object_id将对象元数据(all_objects)和对象定义(sql_modules)关联;
-
过滤条件:
-
is_ms_shipped=0:排除系统内置对象,避免干扰结果;
-
type in ('P'):精准筛选存储过程;
-
definition like '%techn_need%':模糊匹配存储过程内的关键字;
- 排序展示:按存储过程名称升序排列,方便查看。
2.4 扩展用法
-
替换%techn_need%:可检索任意关键字(表名、字段名、业务关键词);
-
扩展type筛选:V=视图、FN=标量函数、TF=表值函数,批量检索多类型对象。
三、第二段脚本:检索含关键字的数据表字段
3.1 完整脚本
sql
-- 查询字段名包含指定关键字的用户自定义表
select
so.name as tbl, -- 数据表名称
sc.name as col, -- 字段名称
sc.length -- 字段长度
from syscolumns sc
inner join sysobjects so on so.id = sc.id -- 内连接关联表和字段
where
sc.name like '%techn_need%' -- 字段名包含关键字techn_need
and so.xtype= 'u' -- 仅筛选用户自定义表
and so.name not like '%[0-9]' -- 排除表名以数字结尾的表
and so.name not like 'temp%' -- 排除以temp开头的临时表
and so.name not like '%temp' -- 排除以temp结尾的临时表
order by so.name; -- 按表名升序排序
3.2 核心系统视图解析
- syscolumns
存储所有数据库对象的字段信息,核心字段:
-
name:字段名称;
-
length:字段长度;
-
id:所属对象的ID(关联表的ID)。
- sysobjects
数据库对象基础视图,核心字段:
-
name:对象名称;
-
xtype:对象类型(U=用户自定义表);
-
id:对象唯一ID。
注意:syscolumns和sysobjects是兼容视图,SQL Server 2005+推荐使用sys.columns和sys.tables,但兼容视图在老版本中仍可正常使用。
3.3 脚本逻辑拆解
-
内连接:通过对象ID(id)将字段(syscolumns)和所属表(sysobjects)关联;
-
精准过滤:
-
xtype='U':只查询用户自定义表,排除系统表、视图等;
-
三层not like:过滤临时表、命名不规范的表,保证结果纯净;
-
sc.name like '%techn_need%':匹配字段名包含关键字的字段;
- 结果展示:返回表名、字段名、字段长度,按表名排序。
3.4 兼容视图升级写法(SQL Server 2005+)
sql
-- 新版系统视图写法(推荐)
select
t.name as tbl,
c.name as col,
c.max_length as length
from sys.columns c
inner join sys.tables t on t.object_id = c.object_id
where
c.name like '%techn_need%'
and t.is_ms_shipped = 0
and t.name not like '%[0-9]'
and t.name not like 'temp%'
and t.name not like '%temp'
order by t.name;