问题描述
我正在处理一个巨大的数据库,我必须获取用于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中使用。