方法一:利用跟踪文件进行查询
1.首先,使用以下查询来启用SQL Server的跟踪功能:
EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'default trace enabled', 1; RECONFIGURE;
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替换为您想要查询的时间段。
注意:这种方法需要启用跟踪功能,并且跟踪文件可能会变得很大,因此请在使用完成后及时关闭跟踪功能。
方法二:利用系统视图 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配置允许,这种方法是一种简单直接的查询执行历史的方式。