如何仅获取视图SELECT投影列对应的源表名称?
获取视图投影列对应的源表名称
针对你的需求,这里提供一个基于SQL Server系统视图和动态管理函数的解决方案,可以精准筛选出SELECT投影列对应的源表,排除JOIN条件中涉及的列:
解决方案脚本
假设你的视图名为YourViewName,替换为实际视图名后执行以下SQL:
WITH ViewColumns AS ( -- 获取视图的所有投影列 SELECT c.name AS ViewColumnName, c.column_id FROM sys.views v JOIN sys.columns c ON v.object_id = c.object_id WHERE v.name = 'YourViewName' ), ReferencedColumns AS ( -- 获取视图引用的所有列及其源表信息 SELECT referenced_entity_name AS SourceTableName, referenced_minor_name AS SourceColumnName, name AS ViewColumnName, column_id FROM sys.dm_sql_referenced_entities('YourViewName', 'OBJECT') WHERE referenced_minor_id <> 0 -- 仅保留列级引用,排除表级引用 ) -- 关联筛选,只保留投影列对应的源表 SELECT vc.ViewColumnName, rc.SourceTableName FROM ViewColumns vc JOIN ReferencedColumns rc ON vc.ViewColumnName = rc.ViewColumnName ORDER BY vc.column_id;
脚本说明
- ViewColumns CTE:通过
sys.views和sys.columns获取视图的所有投影列,对应你已经拿到的列列表。 - ReferencedColumns CTE:使用
sys.dm_sql_referenced_entities动态管理函数,获取视图中所有被引用列的源表、源列以及视图中对应的列名。该函数会自动识别列的别名映射,即使投影列使用了别名也能正确匹配。 - 关联筛选:将视图的投影列与引用列关联,只保留存在于投影列中的记录,从而排除JOIN条件里的无关列。
替代方案(文本解析)
如果系统函数无法满足需求,也可以通过解析视图定义文本实现,但这种方法需要处理复杂的格式(如换行、注释、函数嵌套等),示例思路如下:
- 从
sys.sql_modules获取视图的定义文本。 - 提取SELECT子句到FROM子句之间的内容,拆分出每个投影列。
- 解析每个列的表别名/源表名,再关联
sys.tables获取正式表名。
不过这种方法可靠性较低,优先推荐使用系统函数的方案。
内容的提问来源于stack exchange,提问作者Aftab Ahmed Kalhoro
相关产品推荐
相关产品推荐

