如何提取 SQL 查询中的所有表(包括引用)?
How to extract all tables (including where references) within a SQL query?
我正在处理一个庞大的数据库,我必须获得用于 100 多个过程的所有 table 的列表。到目前为止,我已经能够得到一个查询,其中 returns 过程从中获取数据的所有 table,但没有引用所有 table。例如:
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],ref,referenced_database_name;
如果程序看起来像这样,则使用该查询:
Select * from A where date=(select max(date) from B)
我只会得到 table A,但我还需要 table B 才能出现。
似乎所有 SQL 查询都只收集实际集成到最终 select 语句中的数据,但像“where”、“in”、“not in”、coalesce 等引用,被放在一边。
也许它有点原始,但我只是想知道如何才能确保如果仅以任何方式提及 table 我就能得到它。
我还没有找到任何东西,也尝试使用 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 中。
我正在处理一个庞大的数据库,我必须获得用于 100 多个过程的所有 table 的列表。到目前为止,我已经能够得到一个查询,其中 returns 过程从中获取数据的所有 table,但没有引用所有 table。例如:
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],ref,referenced_database_name;
如果程序看起来像这样,则使用该查询:
Select * from A where date=(select max(date) from B)
我只会得到 table A,但我还需要 table B 才能出现。 似乎所有 SQL 查询都只收集实际集成到最终 select 语句中的数据,但像“where”、“in”、“not in”、coalesce 等引用,被放在一边。 也许它有点原始,但我只是想知道如何才能确保如果仅以任何方式提及 table 我就能得到它。 我还没有找到任何东西,也尝试使用 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 中。