48  
查询码: 00000473
查询到指定时间段内执行的SQL语句以及它们的开始时间
作者: 周杨 于 2023年11月20日 发布在分类 / 计算机应用 / 数据库 / SQLSERVER ,于 2023年11月20日 编辑
SQL

方法一:利用跟踪文件进行查询

1.首先,使用以下查询来启用SQL Server的跟踪功能:

EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'default trace enabled', 1;
RECONFIGURE;

2.接下来,使用以下查询来查找默认跟踪文件的位置:
SELECT path FROM sys.traces WHERE is_default = 1;

该查询将返回跟踪文件的路径。

3.使用以下查询来获取指定时间段内运行的SQL语句:

DECLARE @tracepath NVARCHAR(256);
DECLARE @endtime DATETIME, @starttime DATETIME;

-- 将@tracepath替换为前面查询到的跟踪文件路径
SET @tracepath = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\Log\log.trc';

-- 将@endtime和@starttime替换为指定的时间段
SET @endtime = '2022-01-01 23:59:59';
SET @starttime = '2022-01-01 00:00:00';

SELECT
    TE.name AS EventName,
    SPID AS SessionID,
    StartTime,
    TextData AS SQLStatement
FROM
    sys.fn_trace_gettable(@tracepath, DEFAULT) FT
INNER JOIN
    sys.trace_events TE ON FT.EventClass = TE.trace_event_id
WHERE
    StartTime BETWEEN @starttime AND @endtime
    AND EventSubClass = 1  -- 过滤掉只返回结果的事件
    AND DatabaseID = DB_ID()  -- 只返回当前数据库的语句
ORDER BY
    StartTime;
请确保将@tracepath替换为实际的跟踪文件路径,并将@endtime和@starttime替换为您想要查询的时间段。

通过上述步骤,您可以获得指定时间段内在SQL Server中运行的SQL语句。

注意这种方法需要启用跟踪功能,并且跟踪文件可能会变得很大,因此请在使用完成后及时关闭跟踪功能。

方法二:利用系统视图 sys.dm_exec_query_stats 和 sys.dm_exec_sql_text查询

DECLARE @endtime DATETIME, @starttime DATETIME;
SET @endtime = DATEADD(DAY, -1, CONVERT(DATE, GETDATE()));
SET @starttime = DATEADD(HOUR, 8, CONVERT(DATETIME, CONVERT(DATE, @endtime)));
SET @endtime = DATEADD(HOUR, 9, CONVERT(DATETIME, CONVERT(DATE, @endtime)));

SELECT
    deqs.creation_time AS StartTime,
    SUBSTRING(dest.text, (deqs.statement_start_offset/2)+1,
        ((CASE deqs.statement_end_offset
             WHEN -1 THEN DATALENGTH(dest.text)
             ELSE deqs.statement_end_offset
         END - deqs.statement_start_offset)/2) + 1) AS SQLStatement
FROM
    sys.dm_exec_query_stats AS deqs
CROSS APPLY
    sys.dm_exec_sql_text(deqs.sql_handle) AS dest
WHERE
    deqs.creation_time BETWEEN @starttime AND @endtime;

注意:这种方法可能无法获取所有的SQL语句,因为查询统计信息可能会被重置或清除,或者某些查询可能已经从缓存中移除。但是,如果您的SQL Server配置允许,这种方法是一种简单直接的查询执行历史的方式。









 历史版本

备注 修改日期 修改人
格式调整 2023-11-20 11:05:12[当前版本] 系统管理员
创建版本 2023-11-20 10:18:40 周杨

知识分享平台 -V 5.1.4 -大信谛威