SQL查询中的表名列表

时间:2013-10-09 16:53:33

标签: sql sql-server

我正在尝试寻找一种方法来获取在过去30天内在SQL Server数据库中执行的各种查询中使用的所有表名的列表。

我有查询并想知道我们是否可以通过编程方式(而不是手动解析它)从中获取表名列表,或者可以从任何SQL Server系统表中获取详细信息。

1 个答案:

答案 0 :(得分:1)

假设服务器在过去30天内未重新启动,可能更准确地确定查询了哪些表(如果您的查询集合不完整):

SET ANSI_WARNINGS OFF;
SET NOCOUNT ON;
GO

;WITH agg AS
(
    SELECT 
        [object_id],
        last_user_seek,
        last_user_scan,
        last_user_lookup,
        last_user_update
    FROM
        sys.dm_db_index_usage_stats
    WHERE
        database_id = DB_ID()
)
SELECT
    [Schema] = OBJECT_SCHEMA_NAME([object_id]),
    [Table_Or_View] = OBJECT_NAME([object_id]),
    last_read = MAX(last_read),
    last_write = MAX(last_write)
FROM
(
    SELECT [object_id], last_user_seek, NULL FROM agg
    UNION ALL
    SELECT [object_id], last_user_scan, NULL FROM agg
    UNION ALL
    SELECT [object_id], last_user_lookup, NULL FROM agg
    UNION ALL
    SELECT [object_id], NULL, last_user_update FROM agg
) AS x ([object_id], last_read, last_write)
GROUP BY
    OBJECT_SCHEMA_NAME([object_id]),
    OBJECT_NAME([object_id])
ORDER BY [Schema],[Table_Or_View];

如果您想依赖于您收集的查询,则没有将查询映射到表的魔术系统表。因此,不确定您收集的这些查询的确切位置,但您可以尝试使用sys.dm_exec_cached_planssys.dm_exec_sql_text从计划XML中解析表或索引名称。这并不简单,除非你的内存超出了你可能需要的内存,否则30天的查询计划目前都不在计划缓存中。