SQL Server 系统视图深度应用:批量检索含关键字的存储过程与数据表字段

在SQL Server数据库开发、维护及优化工作中,我们经常需要快速定位包含特定业务关键字的数据库对象,比如查找引用了某个业务字段的存储过程、检索包含特定关键字的数据表字段等。

直接手动逐对象排查效率极低,而SQL Server提供的系统视图可以高效完成这类批量检索需求。本文将深度解析两段实用SQL脚本,帮助你快速掌握通过系统视图批量查询数据库对象的核心技巧。

一、脚本整体业务场景

这两段脚本是SQL Server数据库运维高频工具,核心作用:

  1. 第一段:查找自定义存储过程中包含指定关键字techn_need的对象,同时获取存储过程的定义语句;

  2. 第二段:查找用户自定义数据表中,字段名包含指定关键字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 核心系统视图解析
  1. sys.all_objects

数据库所有对象的基础视图,包含存储过程、表、视图、函数等所有对象的元数据,核心字段:

  • name:对象名称;

  • type:对象类型编码(P代表存储过程);

  • is_ms_shipped:标识是否为微软系统自带对象(0=自定义,1=系统对象);

  • object_id:对象唯一标识ID。

  1. sys.sql_modules

存储SQL对象定义文本的系统视图,所有可编程对象(存储过程、视图、函数等)的SQL代码都存储在definition字段中,通过object_id与其他系统视图关联。

2.3 脚本逻辑拆解
  1. 多表关联:通过object_id将对象元数据(all_objects)和对象定义(sql_modules)关联;

  2. 过滤条件:

  • is_ms_shipped=0:排除系统内置对象,避免干扰结果;

  • type in ('P'):精准筛选存储过程;

  • definition like '%techn_need%':模糊匹配存储过程内的关键字;

  1. 排序展示:按存储过程名称升序排列,方便查看。
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 核心系统视图解析
  1. syscolumns

存储所有数据库对象的字段信息,核心字段:

  • name:字段名称;

  • length:字段长度;

  • id:所属对象的ID(关联表的ID)。

  1. sysobjects

数据库对象基础视图,核心字段:

  • name:对象名称;

  • xtype:对象类型(U=用户自定义表);

  • id:对象唯一ID。

注意:syscolumns和sysobjects是兼容视图,SQL Server 2005+推荐使用sys.columns和sys.tables,但兼容视图在老版本中仍可正常使用。

3.3 脚本逻辑拆解
  1. 内连接:通过对象ID(id)将字段(syscolumns)和所属表(sysobjects)关联;

  2. 精准过滤:

  • xtype='U':只查询用户自定义表,排除系统表、视图等;

  • 三层not like:过滤临时表、命名不规范的表,保证结果纯净;

  • sc.name like '%techn_need%':匹配字段名包含关键字的字段;

  1. 结果展示:返回表名、字段名、字段长度,按表名排序。
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;
相关推荐
小尔¥2 小时前
MySQL故障排查与优化
运维·数据库·mysql
rrrjqy2 小时前
Redis常见问题(一)
数据库·redis·缓存
Humbunklung2 小时前
WMO 天气代码(Code Table 4677)深度解析与应用报告
开发语言·数据库·python
道清茗2 小时前
【MySQL知识点问答题】锁机制、索引优化与数据库恢复方法
数据库·mysql
hero.fei2 小时前
排查redis出现报错ERR redis temporary failure
数据库·redis·缓存
野犬寒鸦3 小时前
MySQL复习记录Day01
数据库·后端
ward RINL3 小时前
Spring boot启动原理及相关组件
数据库·spring boot·后端
RisunJan3 小时前
Linux命令-mysqldump(MySQL数据库中备份工具)
linux·数据库·mysql
DolphinDB智臾科技3 小时前
直播回顾 | 物联网时序数据库如何驱动电力场景智能调度?
数据库·物联网·时序数据库