从T-SQL查询中获取所有表名和列名的方法

时间:2016-01-18 14:45:18

标签: sql sql-server tsql

我有非常大的查询(这里使用了超过100个表和数千列),我需要获取此查询中使用的所有列和表的列表。也许有任何已经创建的软件或脚本来实现它?

例如:

查询:

SELECT t1.Col1, t1.Col2, t1.Col3, t2.Col4, t2.Coln
FROM TableName1 t1
JOIN TableName2 t2 ON t1.Col1 = t2.Col4

输出应为:

TableName1
Col1
Col2
Col3

TableName2
Col4
Coln

1 个答案:

答案 0 :(得分:0)

我同意这些评论,询问您为什么需要此类信息以及为什么查询需要查询这么多表。除此之外,这仍然是可以解决的。

一些低技术方式将是:

  1. 如果查询中引用的所有表都是模式限定的(例如dbo.table_name),它们应该是为了获得最佳性能,请在文本编辑器中搜索模式,或者编写一个小的shell脚本来解析查询dbo的文字。
  2. 提取查询的执行计划,并使用XML从中提取对象列表。
  3. 但这就是我要做的。这可能是最简单和最可靠的。 将查询放入存储过程,安装过程并检查其依赖关系。

    在SQL Server Management Studio中,如果右键单击存储过程,则会出现“查看依赖项”菜单项,该项将显示它依赖的表。如果您需要更多程序化答案,可以从DMV(sys.dm _ *)中提取依赖项。

    select re.referenced_schema_name + '.' + re.referenced_entity_name as table_name
    from sys.dm_sql_referenced_entities('PROC_NAME', 'OBJECT') re
    where re.referenced_minor_id = 0;
    

    这也为查询调用的任何函数返回一行。如果需要,我相信你可以通过加入分解对象类型的DMV来过滤掉它们。