【问题标题】:How to see progress of running SQL stored procedures?如何查看运行 SQL 存储过程的进度?
【发布时间】:2012-04-25 08:18:48
【问题描述】:

考虑以下存储过程..

CREATE PROCEDURE SlowCleanUp (@MaxDate DATETIME)
AS
BEGIN
    PRINT 'Deleting old data Part 1/3...'
    DELETE FROM HugeTable1 where SaveDate < @MaxDate

    PRINT 'Deleting old data Part 2/3...'
    DELETE FROM HugeTable2 where SaveDate < @MaxDate

    PRINT 'Deleting old data Part 3/3...'
    DELETE FROM HugeTable3 where SaveDate < @MaxDate

    PRINT 'Deleting old data COMPLETED.'
END

假设每个删除语句都需要很长时间才能删除,但我喜欢在 SQL Management Studio 中运行此存储过程时查看它的进度。换句话说,我喜欢查看 PRINT 语句的输出,以了解我在任何给定时间的位置。但是,似乎我只能在整个运行结束时看到 PRINT 输出。有没有办法让我可以实时看到 PRINT 输出?如果没有,有没有其他方法可以查看正在运行的存储过程的进度?

【问题讨论】:

    标签: sql tsql ssms


    【解决方案1】:

    如果您使用RAISERROR 的严重性为10 或更低,并使用NOWAIT 选项,它将立即向客户端发送一条信息性消息:

    RAISERROR ('Deleting old data Part 1/3' , 0, 1) WITH NOWAIT

    【讨论】:

    • 谢谢,这正是我所需要的! :)
    【解决方案2】:

    是的,如果您使用RAISERROR:,您应该能够立即打印消息

    RAISERROR('Hello',10,1) WITH NOWAIT

    【讨论】:

      【解决方案3】:

      我找到了一种很棒的非侵入式方式来查看运行存储过程的进度。使用我在 SP_WHO2 的 Stackoverflow 上找到的代码,您可以看到第一列包含实际从 PROC 运行的当前代码。每次你重新运行这个 SP_Who2 进程时,它都会显示当时运行的代码。这会让你随时知道你的进程有多远。这是我修改的 sp_who2 代码,以便更容易跟踪进度:

      Declare @loginame sysname = null
      DECLARE @whotbl TABLE 
          ( 
            SPID        INT    NULL 
           ,Status    VARCHAR(50)    NULL 
           ,Login        SYSNAME    NULL 
           ,HostName    SYSNAME    NULL 
           ,BlkBy        VARCHAR(5)    NULL 
           ,DBName    SYSNAME    NULL 
           ,Command    VARCHAR(1000)    NULL 
           ,CPUTime    INT    NULL 
           ,DiskIO    INT    NULL 
           ,LastBatch VARCHAR(50)    NULL 
           ,ProgramName VARCHAR(200)    NULL 
           ,SPID2        INT    NULL 
           ,RequestID INT    NULL 
           ) 
          INSERT INTO @whotbl 
           EXEC sp_who2  @loginame = @loginame 
      
          SELECT CommandText = sql.text ,
                 W.*  
                ,ExecutionPlan   = pln.query_plan 
                ,ObjectName  = so.name  
                ,der.percent_complete 
                ,der.estimated_completion_time 
                --,CommandType =der.command 
            FROM @whotbl  W 
       LEFT JOIN sys.dm_exec_requests der 
              ON der.session_id = w.SPID 
             OUTER APPLY SYS.dm_exec_sql_text (der.sql_handle) Sql 
             OUTER APPLY sys.dm_exec_query_plan (der.plan_handle) pln 
       LEFT JOIN sys.objects so 
      

      我希望我记得我从谁那里得到了这个原始代码,但它非常有帮助。如果我需要终止进程,它还会识别 SPID。

      【讨论】:

      • 您是否发布了错误问题的答案?我看不出你的回答与我的问题有什么关系......
      • 另外,它并不完整,先生。 sys.objects 不启用...
      • "每次重新运行这个SP_Who2进程,都会显示当时运行的代码。"如果您的存储过程需要时间,您可以从另一个查询窗口运行它,它会告诉您当时卡住的代码。只需在同一服务器上的不同查询窗口中尝试即可。就像我提到的那样,我一直使用它来帮助我处理长时间运行的存储过程或查询。 yeOlddataSmyth 是对的,我缺少部分代码。我会搜索的。
      猜你喜欢
      • 1970-01-01
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多