如何从SQL Server视图中获取源表原始列名元数据?
获取SQL Server视图列对应的源表原始列名
要获取视图列对应的源表原始列名,最简便且可靠的方法是使用SQL Server的动态管理函数 sys.dm_exec_describe_first_result_set_with_browse_info,它能返回结果集的详细元数据,包括每个列的源表和源列信息。
示例查询代码
SELECT s.name AS schema_name, v.name AS view_name, col.name AS view_column_name, browse_info.source_schema_name, browse_info.source_table_name, browse_info.source_column_name FROM sys.views v JOIN sys.schemas s ON v.schema_id = s.schema_id JOIN sys.columns col ON v.object_id = col.object_id CROSS APPLY sys.dm_exec_describe_first_result_set_with_browse_info( 'SELECT * FROM ' + QUOTENAME(s.name) + '.' + QUOTENAME(v.name), NULL, 0 ) browse_info WHERE col.column_id = browse_info.column_ordinal ORDER BY s.name, v.name, col.column_id;
代码说明
- 该查询通过
sys.dm_exec_describe_first_result_set_with_browse_info获取视图结果集的浏览信息,其中包含了每个列对应的源架构、源表和源列名。 QUOTENAME函数用于处理包含特殊字符的架构或视图名,避免SQL语法错误。- 通过
column_id和column_ordinal关联视图列和DMF返回的结果列,确保映射准确。
备选方法(仅适用于简单视图)
如果视图定义非常简单(仅包含基础列映射,无计算列、嵌套视图等),也可以通过解析视图定义文本提取映射关系,但这种方法局限性较大:
SELECT schema_name(v.schema_id) AS schema_name, v.name AS view_name, col.name AS view_column_name, SUBSTRING( m.definition, CHARINDEX('AS ' + QUOTENAME(col.name), m.definition) - CHARINDEX(' ', REVERSE(SUBSTRING(m.definition, 1, CHARINDEX('AS ' + QUOTENAME(col.name), m.definition) - 1))) + 1, CHARINDEX(' ', REVERSE(SUBSTRING(m.definition, 1, CHARINDEX('AS ' + QUOTENAME(col.name), m.definition) - 1))) - 1 ) AS source_column_name FROM sys.views v JOIN sys.sql_modules m ON v.object_id = m.object_id JOIN sys.columns col ON v.object_id = col.object_id WHERE v.name = 'person' AND schema_name(v.schema_id) = 'dim';
注意:这种字符串解析方式仅支持
源列名 AS 视图列名的简单格式,遇到复杂视图会失效,因此优先推荐使用动态管理函数的方案。
内容的提问来源于stack exchange,提问作者Fred
相关产品推荐
相关产品推荐

