如何使用用户名检索上次运行的查询

时间:2016-02-17 19:42:40

标签: sql sql-server sql-server-2008

我最近遇到了一些问题,这些查询大量更新了我的一个表格,我正试图发现可能出错的地方。

我需要知道是否有任何方法可以使用至少用户名来检索上次运行的查询,如果可能的话还有@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

任何帮助将不胜感激。感谢。

1 个答案:

答案 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;