¿Es posible registrar valores de parámetros entrantes en una llamada a procedimiento mientras se rastrea en SQL Server Profiler?


13

Con SQL Server Profiler (estoy en SQL Server 2012), intento generar un seguimiento útil que muestre los valores de los parámetros, no solo el SQL con nombres de variables. El procedimiento almacenado recorre una gran cantidad de datos de Inventario para generar algunos resultados extremadamente valiosos, y estoy tratando de documentar el comportamiento existente, para poder probarlo, definirlo exactamente y luego refactorizarlo en algo sensato.

Tengo un procedimiento almacenado que ejecuta un subprocedimiento de 54 parámetros, dentro de un ciclo donde el procedimiento almacenado crea un cursor y luego realiza un ciclo while. Aquí hay una vista simplificada:

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        

¿Cómo obtendría un seguimiento para mostrarme todos los valores de parámetros pasados InnerProcedureCallWithinLoop? Hay 54 parámetros. ¿Tengo que escribir esencialmente "54 líneas de debug-printfs" dentro de mi SQL o puedo volcar todos los valores de parámetros de una llamada a procedimiento mientras hago un seguimiento de SQL de alguna manera?

Cuando obtengo un rastro en este momento, obtengo esta salida:

EXEC  @ConsiderItem = InnerProcedureCallWithinLoop  @from_locn,        
                        @About53ParmsOmitted

Lo que me gustaría saber es que @from_locn = 1y @About53ParmsOmitted = 'hello world'y así sucesivamente.

Esto no me dice el valor real del parámetro @from_locn. En el caso de ese primer parámetro, se pasa a mi procedimiento almacenado de nivel superior, por lo que sé que es 0 o 1, según sea el caso. Sin embargo, alrededor de 40 de los 43 parámetros de ese procedimiento interno provienen de la FETCH NEXT FROM aCursoroperación dentro de un WHILEbucle.

En este momento, el seguimiento me dice cuántas veces InnerProcedureCallWithinLoopse invoca y cuánto tiempo tomó cada una, pero no cuáles fueron los valores de los parámetros de esa llamada. Si de alguna manera pudiera obtener "scripts SQL independientes ejecutables" que replican algún caso de esquina que encuentro dentro de mi código, al rastrear estos scripts, configurando estas funciones generales (lo sé, 54 parámetros, eso es realmente bruto, pero no escribí ¡ellos!) podría tomarme una hora de escribir solo para crear un script SQL que me permita invocar este caso de esquina yo mismo, fuera de este gran gruñido gigantesco de procedimientos almacenados de SQL Server.

Todo esto es parte de un esfuerzo por profundizar en una expresión SQL y crear scripts que puedan sondear estos complejos procedimientos almacenados.

Actualización Encontré una opción de grabación "Parámetros de salida" RPC, pero no una opción de grabación "RPC IN PARAM".


No son solo los 54 parámetros los que son asquerosos :-) Todo ese bucle para llamar a un cursor. Eso es asqueroso :-) ¿Has jugado con el Plan Explorer de SQL Sentry? Puede usar la versión gratuita o una versión de prueba de la versión completa y eso puede ayudarlo si tiene una llamada con todos los parámetros - sqlsentry.net/plan-explorer/sql-server-query-view.asp
Mike Walsh

¿Puedes decirnos qué eventos estás capturando?
Mike Walsh

2
¿La única vez que el generador de perfiles captura esos datos (creo) es cuando lo llama? Intente configurar una tabla de auditoría con todos esos parámetros, y simplemente inserte antes de colocar el cursor.
jcolebrand

RPC: Completed muestra los valores de los parámetros pero a nivel externo.
Mike Walsh

3
+1 para la pregunta, como recompensa por tu dolor. Si pudiera, volvería a hacer +1 por publicar la pregunta sin improperios.
Mark Storey-Smith

Respuestas:


8

Morderé la bala y te diré que tal rastro no se puede configurar, porque no es el propósito [percibido] de los rastros. Siempre lo he hecho de esta manera:

MIENTRAS (@@ FETCH_STATUS = 0) Y
            (@ About80MoreBooleanExpressionsHere)
BEGIN / * 1 * /
    - alrededor de 700 líneas de lógica, matemáticas y si-parámetro-esto-entonces-eso
    - cosas omitidas
      INSERT InnerProcedureCallWithinLoop__TraceTable
              VALUES (@from_locn, @ About53PARAMSOMITTED

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

Si sé que solo se llama desde una ubicación. De lo contrario, lo hago en la persona que llama en lugar de la persona que llama.

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

Obviamente, esto es diferente de usar un rastreo, que puede capturar eventos incluso si comenzaron y nunca terminaron (parámetros defectuosos, transacciones revertidas). Si ese es su problema, debe mirar CLR o métodos de correo electrónico para externalizar la salida capturada.


Es lo que pensaba.
Warren P
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.