À l'aide de SQL Server Profiler (je suis sur SQL Server 2012), j'essaie de générer une trace utile qui montre les valeurs des paramètres, pas seulement le SQL avec des noms de variables. La procédure stockée parcourt une quantité brute de données d'inventaire pour générer des résultats extrêmement précieux, et j'essaie de documenter le comportement existant, afin que je puisse le tester à l'unité, le définir exactement, puis le refactoriser en quelque chose de sain.
J'ai une procédure stockée qui exécute une sous-procédure de 54 paramètres, à l'intérieur d'une boucle où la procédure stockée crée un curseur puis fait une boucle while. Voici une vue simplifiée:
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
Comment puis-je obtenir une trace pour me montrer toutes les valeurs de paramètres transmises à
InnerProcedureCallWithinLoop
? Il y a 54 paramètres. Dois-je écrire essentiellement "54 lignes de debug-printfs" dans mon SQL ou puis-je vider toutes les valeurs des paramètres d'un appel de procédure tout en faisant un suivi SQL?
Quand j'obtiens une trace maintenant, j'obtiens cette sortie:
EXEC @ConsiderItem = InnerProcedureCallWithinLoop @from_locn,
@About53ParmsOmitted
Ce que je voudrais savoir est que @from_locn = 1
et @About53ParmsOmitted = 'hello world'
et ainsi de suite.
Cela ne me dit pas la valeur réelle du paramètre @from_locn
. Dans le cas de ce premier paramètre, il est transmis à ma procédure stockée de niveau supérieur, donc je sais que c'est 0 ou 1, selon le cas. Cependant, environ 40 des 43 paramètres de cette procédure interne proviennent de l' FETCH NEXT FROM aCursor
opération à l'intérieur d'une WHILE
boucle.
En ce moment, le traçage me dit combien de fois InnerProcedureCallWithinLoop
est invoqué et combien de temps chacune a pris, mais pas quelles étaient les valeurs des paramètres de cet appel. Si je pouvais en quelque sorte obtenir des "scripts SQL autonomes exécutables" qui reproduisent certains cas de coin que je trouve dans mon code, tout en parcourant ces scripts, en configurant ces fonctions brutes (je sais, 54 paramètres, c'est vraiment brut, mais je n'ai pas écrit eux!) pourrait me prendre une heure à taper juste pour construire un script SQL qui me permet d'invoquer moi-même ce cas de coin, en dehors de ce gros grognement gargantuesque de procédures stockées SQL Server.
Tout cela fait partie d'un effort pour explorer une expression SQL et créer des scripts qui peuvent sonder ces procédures stockées complexes.
Mise à jour J'ai trouvé une option d'enregistrement "Output Param" RPC, mais pas une option d'enregistrement "RPC IN PARAM".