22

次のストアドプロシージャを検討してください。

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出力をリアルタイムで確認できるようにする方法はありますか?そうでない場合、実行中のストアドプロシージャの進行状況を確認する他の方法はありますか?

4

3 に答える 3

34

RAISERROR重大度が10以下で使用し、このオプションを使用するNOWAITと、クライアントに情報メッセージがすぐに送信されます。

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

于 2012-04-12T22:40:25.720 に答える
7

はい、 RAISERRORを使用すると、メッセージをすぐに印刷できるはずです。

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

于 2012-04-12T22:41:05.687 に答える
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を識別します。

于 2018-08-13T16:43:12.393 に答える