在SQL Server Profiler中进行跟踪时,是否可以在过程调用中记录传入的参数值?


13

我正在尝试使用SQL Server Profiler(我正在使用SQL Server 2012)来生成有用的跟踪,以显示参数值,而不仅仅是显示带有变量名的SQL。该存储过程将遍历大量库存数据,以产生一些非常有价值的结果,而我正尝试记录现有行为,因此我可以对其进行单元测试,准确定义,然后将其重构为合理的形式。

我有一个执行54参数子过程的存储过程,该过程在一个循环内,在该循环中该存储过程创建一个游标,然后执行while循环。这是一个简化的视图:

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个参数。我是否必须在SQL内写“ 54行debug-printfs”,还是可以在进行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脚本,让我自己在这个SQL Server存储过程如此庞大的咆哮之外自己调用这种极端情况。

这是深入研究SQL表达式并构建可探查这些复杂存储过程的脚本的全部工作。

更新我找到了RPC“输出参数”记录选项,但没有找到“ RPC IN PARAM”记录选项。


总的来说,不仅仅是54个参数:-)所有循环调用游标。太糟糕了:-)您玩过SQL Sentry的Plan Explorer吗?您可以使用免费版本,也可以使用完整版本的试用版,如果您使用所有参数进行呼叫-sqlsentry.net/plan-explorer/sql-server-query-view.asp
Mike Walsh

您能告诉我们您正在捕获哪些事件吗?
迈克·沃尔什

2
探查器唯一捕获该数据的时间(我认为)是在您调用该数据时?尝试使用所有这些参数设置审核表,然后在循环游标之前执行插入操作?
jcolebrand

RPC:Completed在外部显示参数值。
Mike Walsh

3
为问题+1,以补偿您的痛苦。如果可以的话,我会再次+1以无问题地发布问题。
Mark Storey-Smith

Answers:


8

我会忍痛告诉您,无法建立这样的跟踪,因为这不是跟踪的[可感知]目的。我一直这样做:

WHILE(@@ FETCH_STATUS = 0)AND
            (@ About80MoreBooleanExpressionsHere)
BEGIN / * 1 * /
    -大约700行逻辑,数学和if-parameter-this-then-then-               that-
    省略了一些内容
      INSERT InnerProcedureCallWithinLoop__TraceTable
值(@from_locn,@ About53PARAMSOMITTED

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

如果我知道只能从一个位置调用它。否则,我将在被呼叫者而不是呼叫者中执行此操作。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.