我最近遇到了一些问题,这些查询大量更新了我的一个表格,我正试图发现可能出错的地方。
我需要知道是否有任何方法可以使用至少用户名来检索上次运行的查询,如果可能的话还有@Parameters值。
我在网上搜索了很多,并找到了一些解决方案,如:
SELECT
c.session_id, s.host_name, s.login_name, s.status,
st.text, s.login_time, s.program_name, *
FROM
sys.dm_exec_connections c
INNER JOIN
sys.dm_exec_sessions s ON c.session_id = s.session_id
CROSS APPLY
sys.dm_exec_sql_text(most_recent_sql_handle) AS st
WHERE
text LIKE '%YOURPROCHERE%'
ORDER BY
last_read desc
SELECT
SQLTEXT.text, STATS.last_execution_time, *
FROM
sys.dm_exec_query_stats STATS
CROSS APPLY
sys.dm_exec_sql_text(STATS.sql_handle) AS SQLTEXT
WHERE
STATS.last_execution_time > GETDATE()-1
AND sqltext.text LIKE '%YOURPROCHERE%'
ORDER BY
STATS.last_execution_time DESC
但是这些陈述都没有帮助我,他们没有返回任何与错误时间匹配的结果。
我发现一个查询将运行小时与我的问题以及运行的确切查询文本相匹配。但它没有向我显示用户,我无法弄清楚如何根据表格查找用户名。
查询:
SELECT *
FROM
(SELECT
COALESCE(OBJECT_NAME(s2.objectid),'Ad-Hoc') AS ProcName,
execution_count,s2.objectid, s1.sql_handle,
s1.plan_handle, s1.query_plan_hash,
(SELECT TOP 1
SUBSTRING(s2.TEXT,statement_start_offset / 2+1 ,
((CASE WHEN statement_end_offset = -1
THEN (LEN(CONVERT(NVARCHAR(MAX),s2.TEXT)) * 2)
ELSE statement_end_offset
END) - statement_start_offset) / 2 + 1)) AS sql_statement,
last_execution_time
FROM
sys.dm_exec_query_stats AS s1
CROSS APPLY
sys.dm_exec_sql_text(sql_handle) AS s2
) x
WHERE
sql_statement NOT like 'SELECT COALESCE(OBJECT_NAME(s2%' AND sql_statement like '%YOURQUERYHERE%'
--and OBJECTPROPERTYEX(x.objectid,'IsProcedure') = 1
ORDER BY
last_execution_time DESC
任何帮助将不胜感激。感谢。
答案 0 :(得分:0)
您可以尝试查看默认启用的SQL Blackbox Trace。它捕获了在服务器上执行的一些先前查询。它确实有一个限制,在繁忙的生产服务器上,它通常限于几分钟的数据。
DECLARE @filename nvarchar(512);
SELECT @filename = CAST(value as nvarchar(512))FROM fn_trace_getinfo(1) where property = 2;
SELECT * FROM
fn_trace_gettable (@filename, DEFAULT) WHERE TextData IS NOT NULL;