给你一段sql,你可以查到这个数据库任何时候的运行的sql SELECT TOP 1000 st.text,QS.sql_handle, SUBSTRING(ST.text,(QS.statement_start_offset/2)+1, ((CASE QS.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE QS.statement_end_offset END - QS.statement_start_offset)/2) + 1 ) AS statement_text, ST.text, QS.creation_time, QS.total_worker_time, QS.last_worker_time, QS.max_worker_time, QS.min_worker_time FROM sys.dm_exec_query_stats QS CROSS APPLY sys.dm_exec_sql_text(QS.sql_handle) ST WHERE QS.creation_time BETWEEN '2019-03-1 17:05:00 ' AND '2019-3-1 17:08:59' ORDER BY QS.creation_time DESC
SELECT TOP 1000
st.text,QS.sql_handle,
SUBSTRING(ST.text,(QS.statement_start_offset/2)+1,
((CASE QS.statement_end_offset WHEN -1 THEN DATALENGTH(st.text)
ELSE QS.statement_end_offset END - QS.statement_start_offset)/2) + 1
) AS statement_text,
ST.text,
QS.creation_time,
QS.total_worker_time,
QS.last_worker_time,
QS.max_worker_time,
QS.min_worker_time
FROM
sys.dm_exec_query_stats QS
CROSS APPLY
sys.dm_exec_sql_text(QS.sql_handle) ST
WHERE
QS.creation_time BETWEEN '2019-03-1 17:05:00 ' AND '2019-3-1 17:08:59'
ORDER BY
QS.creation_time DESC
或者程序里面写日志, 事物执行得时候成功则记录执行得sql 其实也可以查询。
1、数据库层制作触发器或者其他手段在更新后写log。
2、业务层在更新数据库之前在本地写log。
3、使用SqlDependency等监听手段监听表,在代码中实现log。这些根据你的实际需求去定怎么做。
第一个方案只能制造log,如果你打算在插入后做什么处理还要做表数据扫描,数据库资源消耗大。
第二个方案相对灵活但是如果你的框架不好没办法直接从底层实现log和后续动作你的代码工作量很大,但是优势是全部使用本地资源没有增加数据库服务器资源消耗。
第三个方案是数据库资源和本地资源消耗折中的方案,更可以监听select等事件,但是并不是常见方案(依托两边系统才能保证正常的方案稳定性会差)。