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;
相关推荐
2301_783848659 小时前
优化文本分类中堆叠模型的网格搜索性能:避免训练卡顿的实战指南
jvm·数据库·python
TE-茶叶蛋9 小时前
DBeaver 的Explain 执行计划,分析sql的性能
数据库·sql
CLX050510 小时前
如何安装Oracle 12c Cloud Control_OMS服务端组件与Agent部署
jvm·数据库·python
m0_6174939410 小时前
PySide6 网络请求深度实测:从基础 API 调用到数据解析实战指南
数据库
知识汲取者10 小时前
每日一篇高频面试题系列之【MySQL 锁】
数据库·mysql
老纪11 小时前
SQL中如何查找特定的空值行:WHERE IS NULL深度解析
jvm·数据库·python
麦聪聊数据11 小时前
数据 API 平台选型:深度解读数据服务的四大关键技术与架构底座
数据库·sql
IT研究所11 小时前
AI 时代下的知识管理:从 Claude 的“复盘”能力看生成式 AI价值
大数据·运维·数据库·人工智能·科技·低代码·自然语言处理
2301_7815714211 小时前
mysql数据库响应缓慢如何排查_使用EXPLAIN分析执行计划
jvm·数据库·python
彳亍10111 小时前
实现倒计时数字在到达1后自动隐藏(2为最后可见数字),同时继续运行至-1再终止
jvm·数据库·python