如何通过sys.sql_modules系统视图或SHOW CREATE命令查看SQL存储过程的源代码?
- 内容介绍
- 相关推荐
本文共计694个文字,预计阅读时间需要3分钟。
查看SQL Server源代码,使用 `sys.sql_modules`;MySQL使用 `SHOW CREATE PROCEDURE` —— 但两者差异极大,不能混用,也不能仅复制一条命令就完事。
SQL Server 查不到源码?先确认 sys.sql_modules.definition 是否为空
执行 SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('your_proc_name') 返回 NULL,不是语法错,大概率是这几种情况:
- 存储过程名没带 schema,比如写成
'usp_GetUser'而不是'dbo.usp_GetUser',OBJECT_ID()默认查当前数据库 + 当前用户默认 schema,跨 schema 必须显式指定 - 过程被创建时加了
WITH ENCRYPTION,此时definition字段永远为 NULL,sp_helptext同样失效,没有绕过办法 - 权限不足:当前登录用户没被授予对
sys.sql_modules的 SELECT 权限(虽少见,但在严格管控库中存在)
MySQL 的 SHOW CREATE PROCEDURE 报 “PROCEDURE does not exist” 怎么办
这不是过程真不存在,而是 MySQL 没找对地方。
本文共计694个文字,预计阅读时间需要3分钟。
查看SQL Server源代码,使用 `sys.sql_modules`;MySQL使用 `SHOW CREATE PROCEDURE` —— 但两者差异极大,不能混用,也不能仅复制一条命令就完事。
SQL Server 查不到源码?先确认 sys.sql_modules.definition 是否为空
执行 SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('your_proc_name') 返回 NULL,不是语法错,大概率是这几种情况:
- 存储过程名没带 schema,比如写成
'usp_GetUser'而不是'dbo.usp_GetUser',OBJECT_ID()默认查当前数据库 + 当前用户默认 schema,跨 schema 必须显式指定 - 过程被创建时加了
WITH ENCRYPTION,此时definition字段永远为 NULL,sp_helptext同样失效,没有绕过办法 - 权限不足:当前登录用户没被授予对
sys.sql_modules的 SELECT 权限(虽少见,但在严格管控库中存在)
MySQL 的 SHOW CREATE PROCEDURE 报 “PROCEDURE does not exist” 怎么办
这不是过程真不存在,而是 MySQL 没找对地方。

