如何在SQL查询中提取所有表包括引用在哪里?

问题描述

我正在处理一个巨大的数据库,我必须获取用于100多个过程的所有表的列表。到目前为止,我已经能够获得一个查询,该查询返回该过程正在从中获取数据的所有表,但是不返回所有被引用的表。例如:

WITH src AS 
(
  SELECT [procedure] = QUOTENAME(s.name) + N'.' + QUOTENAME(o.name),ref = 
      COALESCE(QUOTENAME(d.referenced_server_name)   + N'.',N'')
    + QUOTENAME(d.referenced_schema_name) + N'.'
    + QUOTENAME(d.referenced_entity_name),d.referenced_database_name
  FROM sys.sql_expression_dependencies AS d
  INNER JOIN sys.objects AS o
  ON d.referencing_id = o.[object_id]
  INNER JOIN sys.schemas AS s
  ON o.[schema_id] = s.[schema_id]
  WHERE o.[type] = N'P'
)
SELECT [procedure],ref,referenced_database_name
FROM src
GROUP BY [procedure],referenced_database_name;

如果该过程看起来像这样,请使用该查询

Select * from A where date=(select max(date) from B)

我只会得到表A,但是我也需要表B来显示。 似乎所有的SQL查询仅收集实际上已集成到最终选择语句中的数据,但是诸如“ where”,“ in”,“ not in”,coacece等的引用被搁置了。 也许这很原始,但是我想知道如何做才能确保如果仅以任何方式提及表格,我都能得到它。 我什么也没找到,也尝试用python sql解析器尝试,但没有任何结果。

解决方法

这是一种更现代的方式:

SELECT DISTINCT p.name AS proc_name,t.name AS table_name
FROM sys.sql_dependencies d 
INNER JOIN sys.procedures p ON p.object_id = d.object_id
INNER JOIN sys.tables     t ON t.object_id = d.referenced_major_id
ORDER BY proc_name,table_name

更漂亮的方法

SELECT DISTINCT 
      [object_name] = SCHEMA_NAME(o.[schema_id]) + '.' + o.name,o.type_desc
FROM sys.dm_sql_referenced_entities ('dbo.usp_test1','OBJECT') d
JOIN sys.objects o ON d.referenced_id = o.[object_id]
WHERE o.[type] IN ('U','V')

sys.objects在技术上已被弃用,因此在将来的YMMV中使用。