获取列所属的表名,仅在视图的SELECT语句中使用

编程语言 2026-07-11

假设以下是视图的SELECT语句

SELECT Emp.ID, Emp.FullName, Emp.JoiningDate, Dept.DepartmentName, Reg.RegionName
FROM Employees AS Emp
    INNER JOIN Departments AS Dept
        ON Dept.ID = Emp.DeptID
    INNER JOIN Regions AS Reg
        ON Reg.ID = Emp.RegionID

我能够通过 sys.viewssys.columnsobject_id 列上的连接,得到视图的列名(ID、FullName、JoiningDate、DepartmentName、RegionName)。但我只想获取在SELECT语句中使用的每个列所归属的表名(ID、FullName、JoiningDate、DepartmentName、RegionName)

我已进行搜索,大多数解法建议使用 INFORMATION_SCHEMA.VIEW_COLUMN_USAGE,但它也会返回在JOIN条件中使用的其他列。也就是说

  • ID 列,来自Departments表
  • DeptID 列,来自Employee表
  • ID 列,来自Regions表
  • RegionID 列,来自Employee表

我想只获取在SELECT语句中用于投影的列,以及这些列所属表的名称。

解决方案

你可以使用 sys.dm_exec_describe_first_result_set 函数来实现这一点,将 @include_browse_information 参数设置为 1

select
  ed.name,
  CONCAT_WS(N'.',
    ed.source_server,
    ed.source_database,
    ed.source_schema,
    ed.source_table,
    ed.source_column) AS source_column
from sys.dm_exec_describe_first_result_set(
  N'SELECT * FROM dbo.YourView', NULL, 1) ed
where ed.is_hidden = 0;

db<>fiddle

通常应避免使用 INFORMATION_SCHEMA,因为它主要用于向后兼容,且存在一些不准确之处。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章