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」記録オプションは見つかりませんでした。