You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取SQL Server非系统存储过程列表及对应定义?

SQL Server查询带定义的非系统存储过程方案

原写法问题

你之前直接在SELECT子句加definition字段无法生效,核心原因是sys.objects系统视图仅存储对象基础元数据(名称、类型、ID等),本身不存储存储过程的具体定义文本,同时原语句没有加系统对象过滤条件,会混入系统内置存储过程。

可用查询语句

写法1:使用OBJECT_DEFINITION函数(写法简洁)

SELECT 
    name AS 存储过程名称,
    OBJECT_DEFINITION(object_id) AS 存储过程定义
FROM sys.objects
WHERE 
    type = 'P'
    AND is_ms_shipped = 0 -- 排除微软内置的系统存储过程
ORDER BY name

写法2:关联sys.sql_modules视图(避免长文本截断)

部分数据库客户端会默认截断OBJECT_DEFINITION返回的长文本,遇到定义显示不全的情况可以用关联系统视图的写法:

SELECT 
    o.name AS 存储过程名称,
    m.definition AS 存储过程定义
FROM sys.objects o
INNER JOIN sys.sql_modules m 
    ON o.object_id = m.object_id
WHERE 
    o.type = 'P'
    AND o.is_ms_shipped = 0 -- 排除微软内置的系统存储过程
ORDER BY o.name

注意事项

  • 如果某条存储过程的定义返回NULL,优先检查两个原因:一是当前数据库账号对该存储过程没有VIEW DEFINITION权限,二是存储过程创建时加了WITH ENCRYPTION加密选项,加密对象无法通过系统视图直接读取明文定义
  • is_ms_shipped = 0是通用的系统对象过滤条件,不管是系统存储过程、系统触发器还是其他系统内置对象,该字段值为1都代表是SQL Server安装时自带的系统内置对象

内容的提问来源于stack exchange,提问作者leeblee00

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 00:54:44