SQL Server Profilerでトレース中に、プロシージャ呼び出しで着信パラメーター値を記録することは可能ですか?


13

SQL Server Profiler(私はSQL Server 2012を使用しています)を使用して、変数名を持つSQLだけでなく、パラメーター値を示す便利なトレースを生成しようとしています。ストアドプロシージャは、大量のインベントリデータを調べて非常に価値のある結果を生成します。既存の動作を文書化しようとしているので、ユニットテスト、正確な定義、およびリファクタリングを行って、適切なものにリファクタリングできます。

ストアドプロシージャがカーソルを作成し、whileループを実行するループ内で、54パラメーターサブプロシージャの実行を実行するストアドプロシージャがあります。これは簡略化されたビューです。

CREATE PROCEDURE 
   [dbo].[OuterProcedure]       
   (  @ProductCode varchar(8),          
     -- 41 more parameters omitted
   )
AS            
  SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED   
  SET NOCOUNT ON           
 DECLARE @AboutFourHundredLocalvariables -- omit about 400 local variable declarations.
 -- OMIT ABOUT 10 temporary table declarations.
 DECLARE  aCursor CURSOR FAST_FORWARD FOR         
   SELECT [ID],bkno,  -- about 40 fields omitted.
              FROM vwVeryComplexViewThatDoesALotOfVeryBrutalJoins         
              WHERE  (about_80_boolean_expressions AND omitted_here)
        ORDER BY some,keys,like,this

OPEN aCursor          
FETCH NEXT FROM aCursor /* Get First Record */         
    INTO @ID, @about_40_fields,.... 
WHILE (@@FETCH_STATUS = 0) AND         
          ( @About80MoreBooleanExpressionsHere)  
BEGIN   /* 1 */            
     -- about 700 lines of logic, math and if-parameter-this-then-that
     -- stuff omitted
            EXEC  @ConsiderItem = 
                      InnerProcedureCallWithinLoop
                                            @from_locn,        
                        @About53PARAMSOMITTED,
                                                ...

    FETCH NEXT FROM CurInventory /* Get Next Record */       
       INTO @ID,@MoreStuff,...    
END                   
CLOSE CurInventory          
DEALLOCATE CurInventory        

渡されたすべてのパラメーター値を表示するトレースを取得するにはどうすればよい InnerProcedureCallWithinLoopですか?54個のパラメーターがあります。本質的に「54行のdebug-printfs」をSQL内に記述する必要がありますか、またはSQLトレースを何らかの方法で実行している間にプロシージャ呼び出しのすべてのパラメーター値をダンプできますか?

すぐにトレースを取得すると、次の出力が表示されます。

EXEC  @ConsiderItem = InnerProcedureCallWithinLoop  @from_locn,        
                        @About53ParmsOmitted

私が知りたいのはそれ@from_locn = 1など@About53ParmsOmitted = 'hello world'です。

これは、パラメータの実際の値を教えてくれません@from_locn。その最初のパラメーターの場合、それは最上位のストアドプロシージャに渡されるため、場合によっては0または1であることがわかります。ただし、その内部プロシージャの43個のパラメータのうち約40個は、ループFETCH NEXT FROM aCursor内の操作に由来しWHILEます。

現在、トレースはInnerProcedureCallWithinLoop、何回呼び出され、各呼び出しにどれくらい時間がかかったかを示しますが、その呼び出しのパラメーターの値は何でしたかはわかりません。コード内で見つかったコーナーケースを複製する「実行可能なスタンドアロンSQLスクリプト」を何らかの方法で取得できる場合、これらのスクリプトをトレースし、これらのグロス関数を設定します(54パラメーター、本当にグロスですが、私は書きませんでしたSQL Serverストアドプロシージャのこの巨大なうなり声の外で、このコーナーケースを自分で呼び出すことができるSQLスクリプトを作成するために、入力に1時間かかることがあります。

これはすべて、SQL式にドリルダウンし、これらの複雑なストアドプロシージャをプローブできるスクリプトを構築する取り組みの一部です。

更新 RPC「出力パラメータ」記録オプションが見つかりましたが、「RPC IN PARAM」記録オプションは見つかりませんでした。


総計であるのは54のパラメーターだけではありません:-)カーソルを呼び出すためにループするのはすべてです。それはひどいです:-) SQL SentryのPlan Explorerで遊んだことがありますか?-あなたはすべてのパラメータとのコールがある場合は、無料版を使用するか、完全版の試用版を使用し、それはあなたを助けることができsqlsentry.net/plan-explorer/sql-server-query-view.asp
マイク・ウォルシュ

キャプチャしているイベントを教えてください。
マイクウォルシュ

2
プロファイラーがそのデータをキャッチするのは(私が思うに)それを呼び出すときだけですか?これらすべてのパラメータを使用して監査テーブルを設定してみて、カーソルをループする前に挿入するだけですか?
jcolebrand

RPC:Completedはパラメーター値を表示しますが、外側のレベルです。
マイクウォルシュ

3
あなたの痛みに対する報酬として、質問に対して+1。できれば、質問を虚辞なしで投稿したため、もう一度+1します。
マークストーリースミス

回答:


8

弾丸を噛んで、そのようなトレースは設定できないことを説明します。トレースの[知覚]目的ではないからです。私はいつもこのようにしてきました。

WHILE(@@ FETCH_STATUS = 0)AND
            (@ About80MoreBooleanExpressionsHere)
BEGIN / * 1 * /
    -約700行の論理、数学、およびif-parameter-this-then-       that-
    省略されたもの
INSERT InnerProcedureCallWithinLoop__TraceTable
              VALUES(@from_locn、@ About53PARAMSOMITTED

      EXEC @ConsiderItem =
            InnerProcedureCallWithinLoop
                  @from_locn、
                        @ About53PARAMSOMITTED、
...

1つの場所からのみ呼び出されることがわかっている場合。それ以外の場合は、呼び出し元ではなく呼び出し先で実行します。

ALTER PROC InnerProcedureCallWithinLoop
    @from_locn int,
    @About53PARAMSOMITTED ...
AS
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET NOCOUNT ON;
INSERT InnerProcedureCallWithinLoop__TraceTable VALUES (@from_locn, @prm2, @prm3....
--- rest of proc

これは、トレースを使用することとは明らかに異なります。トレースを使用すると、イベントが開始されて終了しなかった場合でもイベントをキャプチャできます(障害のあるパラメータ、トランザクションのロールバック)。それが問題である場合は、CLRまたは電子メールメソッドを調べて、キャプチャされた出力を外部化する必要があります。


私もそう思っていました。
ウォーレンP
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.