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 = 1
y @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 aCursor
operación dentro de un WHILE
bucle.
En este momento, el seguimiento me dice cuántas veces InnerProcedureCallWithinLoop
se 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".