show create view 是 mysql 查看视图定义最直接可靠的方式,返回原始创建语句,需 show view 权限且视图名须带库名前缀;postgresql 用 pg_get_viewdef() 拼接生成可执行语句;sql server 推荐查 sys.sql_modules;information_schema.views 跨平台支持差,mysql 中该字段常为 null。

MySQL 中用 SHOW CREATE VIEW 查看视图定义
MySQL 不支持直接查 information_schema.VIEWS 获取带格式的完整 SQL(比如缩进、换行),但 SHOW CREATE VIEW 是最直接可靠的方式。它返回的 Create View 字段就是你创建该视图时用的原始语句,包括算法、安全性、字符集等细节。
- 必须有对该视图的
SHOW VIEW权限,否则报错ERROR 1142 (42000): SHOW VIEW command denied - 视图名要写全,如果在非默认库中,得加上库名前缀,例如
SHOW CREATE VIEW mydb.myview - 返回结果里第二列是真正的定义语句,别只看第一列
View;复制时注意去掉开头的CREATE ALGORITHM=...后面可能跟着的DEFINER和SQL SECURITY部分,这些在迁移或复现时容易引发权限问题
PostgreSQL 中查 pg_get_viewdef()
PostgreSQL 把视图定义存在系统表里,但不能直接 SELECT 出“可执行的建视图语句”,得靠函数拼装。pg_get_viewdef() 是核心工具,它返回的是不带 CREATE VIEW 前缀的查询主体,所以你要自己补上。
- 要查具体视图:用
SELECT pg_get_viewdef('myview'::regclass),注意必须转成regclass类型,否则报错function pg_get_viewdef(unknown) does not exist - 如果想连同
CREATE VIEW一起输出,可以拼接:SELECT 'CREATE VIEW myview AS ' || pg_get_viewdef('myview'::regclass) - 视图依赖的 schema 名如果非
public,必须显式指定,比如'myschema.myview'::regclass,否则会找不到
SQL Server 中查 sys.sql_modules 或 sp_helptext
SQL Server 的视图定义存在 sys.sql_modules 表里,object_id 对应视图对象 ID。sp_helptext 是更轻量的替代方式,适合快速查看,但它对长于 4000 字符的定义会自动分行截断(每行最多 255 字符),且不保留原始缩进。
- 推荐优先用查询系统表:
SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('dbo.myview') - 如果视图在其他 schema 下,
OBJECT_ID()必须带 schema 前缀,例如OBJECT_ID('sales.v_customers'),只传'v_customers'可能返回 NULL -
sp_helptext在 SSMS 里执行没问题,但在某些 ODBC 或程序连接下可能因结果集结构特殊而解析失败,不建议用于自动化脚本
跨平台通用做法:从 information_schema.VIEWS 拿 VIEW_DEFINITION
标准 SQL 提供了 information_schema.VIEWS 视图,理论上所有主流数据库都支持,字段 VIEW_DEFINITION 存的就是视图主体 SQL。但它有个硬伤:MySQL 里这个字段永远为 NULL(除非开启 show_create_table_privilege 并且用户有对应权限);PostgreSQL 里它只存简单视图,复杂视图(含 CTE、窗口函数等)也会为空;SQL Server 根本不实现这个表。
- 真正能靠得住的只有 PostgreSQL(对简单视图)和 SQL Server(需额外查
sys.views关联sys.sql_modules) - MySQL 必须放弃这条路,回到
SHOW CREATE VIEW - 别在脚本里无条件依赖
information_schema.VIEWS,先判断数据库类型再选方法
实际用的时候,最常被忽略的是权限和 schema 上下文——不是语句写错了,而是当前用户没权限,或者没指定 schema 导致查不到对象。这点比语法本身更容易卡住人。











