首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何查看SQL存储过程的运行进度?

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

Stack Overflow用户
提问于 2012-04-13 06:34:13
回答 3查看 16.8K关注 0票数 22

考虑以下存储过程..

代码语言:javascript
复制
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语句的输出,以了解我在任何给定时间的位置。但是,我似乎只能看到整个运行结束时的打印输出。有没有办法让我可以实时看到打印输出?如果没有,是否有其他方法可以查看正在运行的存储过程的进度?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-04-13 06:40:26

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

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

票数 34
EN

Stack Overflow用户

发布于 2012-04-13 06:41:06

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

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

票数 7
EN

Stack Overflow用户

发布于 2018-08-14 00:43:12

我已经找到了一种很好的非侵入性的方法来查看存储过程的运行进度。使用我在SP_WHO2的Stackoverflow上找到的代码,您可以看到第一列实际上是从PROC运行的当前代码。每次你重新运行这个SP_Who2进程,它都会显示在time.This上运行的代码,让你知道你的进程在任何时候都走了多远。下面是我修改过的sp_who2代码,以便更容易地跟踪进度:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10132847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档