Sql server SQL Server中存储过程的上次运行日期

Sql server SQL Server中存储过程的上次运行日期,sql-server,Sql Server,我们开始在应用程序中获得大量存储过程。其中许多用于自定义报告,其中许多已不再使用。有人知道我们可以在SQL Server 2005的系统视图上运行一个查询,告诉我们存储过程的最后执行日期吗?简单地说,没有 然而,你可以做一些“好”的事情 使用存储的进程名运行探查器跟踪 在每个过程中添加一行(当然,创建一个选项卡) 插入dbo.SPCall(What,When)值(对象名称(@@PROCID),GETDATE()) 也延长2的持续时间 你可以做一些“有趣”的事情: 把它拿走,看看是谁打电话来

我们开始在应用程序中获得大量存储过程。其中许多用于自定义报告,其中许多已不再使用。有人知道我们可以在SQL Server 2005的系统视图上运行一个查询,告诉我们存储过程的最后执行日期吗?

简单地说,没有

然而,你可以做一些“好”的事情

  • 使用存储的进程名运行探查器跟踪
  • 在每个过程中添加一行(当然,创建一个选项卡)
    • 插入dbo.SPCall(What,When)值(对象名称(@@PROCID),GETDATE()
  • 也延长2的持续时间
  • 你可以做一些“有趣”的事情:

  • 把它拿走,看看是谁打电话来
  • 删除权限,查看谁呼叫
  • 添加
    RAISERROR('Warning:pwn3d:call admin',16,1)
    ,查看谁呼叫
  • 添加
    等待延迟'00:01:00'
    ,查看谁呼叫
  • 你明白了。久经考验的“看谁打电话”的IT支持方法

    如果报表是Reporting Services,则如果可以将代码与报表数据集匹配,则可以为报表运行提供支持

    无论如何,您都不能依赖DMV,因为它们在SQL Server重新启动时被重置。
    查询缓存/锁是暂时的,不会持续任何时间。

    下面的代码应该可以做到这一点(>=2008)


    编辑1:请注意Jeff Modens下面的建议。如果你在这里找到一个过程,你可以确保它是准确的。如果你不知道,那么你就不知道-你不能断定它没有运行。

    哦,现在小心点!闪光的东西不是金子!所有的“统计数据”dm视图和函数在这类问题上存在问题。它们只对缓存中的内容起作用,缓存中的内容的生存期可以用分钟来衡量。如果要使用这样的内容来确定哪些SP是要删除的候选SP,那么当您删除几分钟前使用的SP时,您可能会受到伤害。

    以下摘录摘自给定dm视图的联机丛书

    sys.dm_exec_procedure_stats 返回缓存存储过程的聚合性能统计信息。视图中每个存储过程包含一行,该行的生存期与存储过程保持缓存的时间相同。从缓存中删除存储过程时,相应的行将从此视图中删除

    sys.dm_exec_query_stats 视图在缓存的计划中每个查询语句包含一行,行的生存期与计划本身相关联。从缓存中删除计划时,相应的行将从此视图中删除。

    这在2005年正常工作(如果计划在缓存中)

    我用这个:

    使用YourDB;
    挑选
    对象名称(对象id),
    最后一次执行,
    上次,
    执行次数
    从…起
    sys.dm_exec_procedure_stats ps
    哪里
    较低的(对象名称(对象id))如“Appl name%”
    按1订购
    
    sys.dm_exec_procedure_stats包含有关执行函数、约束和过程等的信息。但行的生命周期有限制,从缓存中删除执行计划时,条目将消失

    Use [yourDatabaseName]
    GO
    SELECT  
            SCHEMA_NAME(sysobject.schema_id),
            OBJECT_NAME(stats.object_id), 
            stats.last_execution_time
        FROM   
            sys.dm_exec_procedure_stats stats
            INNER JOIN sys.objects sysobject ON sysobject.object_id = stats.object_id 
        WHERE  
            sysobject.type = 'P'
        ORDER BY
               stats.last_execution_time DESC  
    
    这将为您提供最近执行的程序列表

    如果要检查最近是否执行了特定的存储过程

    SELECT  
        SCHEMA_NAME(sysobject.schema_id),
        OBJECT_NAME(stats.object_id), 
        stats.last_execution_time
    FROM   
        sys.dm_exec_procedure_stats stats
        INNER JOIN sys.objects sysobject ON sysobject.object_id = stats.object_id 
    WHERE  
        sysobject.type = 'P'
        and (sysobject.object_id = object_id('schemaname.procedurename') 
        OR sysobject.name = 'procedurename')
    ORDER BY
           stats.last_execution_time DESC  
    

    如果在SQL Server 2016或更新版本上启用查询存储,则可以使用以下查询获取上次SP执行。历史记录取决于查询存储配置

    SELECT 
          ObjectName = '[' + s.name + '].[' + o.Name  + ']'
        , LastModificationDate  = MAX(o.modify_date)
        , LastExecutionTime     = MAX(q.last_execution_time)
    FROM sys.query_store_query q 
        INNER JOIN sys.objects o
            ON q.object_id = o.object_id
        INNER JOIN sys.schemas s
            ON o.schema_id = s.schema_id
    WHERE o.type IN ('P')
    GROUP BY o.name , + s.name 
    

    我们有调用它们的所有存储过程日志。我们所有的存储过程都有一个会话ID参数,该参数包含在日志中(以及引发的任何错误和持续时间)。我们一直都很满意(到目前为止!)这是一个非常有用的脚本,谢谢,一个小的更正,在第二行你错过了一个“e”,它应该是
    a.last_execution\u time
    ,谢谢和+1。非常有用的DMV。我们还能得到程序提供的输入参数吗?很好。我想是e> 其中数据库名称(ps.database\u id)我们应该用数据库的名称填空。它不显示所有存储过程,只显示上次运行的存储过程。公平地说,如果一个条目存在于@像素化的查询中,那么最后的执行时间是准确的,但是如果缺少一个条目,那么您就不能对它的最后一个EXE作出任何假设。执行时间?很抱歉回答得太晚了。我最近没来过这里。你上面说的是对的。我第一次使用“查看谁呼叫”在终端控制器上查找额外端口。
    SELECT  
        SCHEMA_NAME(sysobject.schema_id),
        OBJECT_NAME(stats.object_id), 
        stats.last_execution_time
    FROM   
        sys.dm_exec_procedure_stats stats
        INNER JOIN sys.objects sysobject ON sysobject.object_id = stats.object_id 
    WHERE  
        sysobject.type = 'P'
        and (sysobject.object_id = object_id('schemaname.procedurename') 
        OR sysobject.name = 'procedurename')
    ORDER BY
           stats.last_execution_time DESC  
    
    SELECT 
          ObjectName = '[' + s.name + '].[' + o.Name  + ']'
        , LastModificationDate  = MAX(o.modify_date)
        , LastExecutionTime     = MAX(q.last_execution_time)
    FROM sys.query_store_query q 
        INNER JOIN sys.objects o
            ON q.object_id = o.object_id
        INNER JOIN sys.schemas s
            ON o.schema_id = s.schema_id
    WHERE o.type IN ('P')
    GROUP BY o.name , + s.name