如何获取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
相关产品推荐
相关产品推荐

