如何查看运行SQL存储过程的进度?

时间:2012-04-12 22:34:13

标签: sql tsql ssms

考虑以下存储过程..

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

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

3 个答案:

答案 0 :(得分:32)

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

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

答案 1 :(得分:6)

是的,如果您使用RAISERROR:

,您应该可以立即打印消息

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

答案 2 :(得分:0)

我发现了一种很好的非侵入式方式来查看存储过程的运行进度。使用我在SP_WHO2的Stackoverflow上找到的代码,您可以看到第一列包含当前正在从PROC运行的当前代码。每次您重新运行此SP_Who2进程时,它将显示当时正在运行的代码。这将使您随时知道proc的运行距离。这是我修改的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。