Comment tracer T-SQL appels de fonction
Je suis en train de déboguer un plutôt compliqué évaluateur de formule écrite en T-SQL Udf (ne demandez pas) que de manière récursive (mais indirectement par le biais d'un intermédiaire de la fonction) s'appelle elle-même, bla, bla.
Et, bien sûr, nous avons un bug.
Maintenant, à l'aide des instructions d'IMPRESSION (qui peut être lu à partir de ADO.NET par la mise en œuvre d'un gestionnaire pour l'événement InfoMessage), je peux simuler une trace pour les procédures stockées.
Faire la même chose pour UDF résultats dans un moment de la compilation du message:
Invalid use of side-effecting or time-dependent operator in 'PRINT' within a function.
Je reçois le message (IMPRESSION de ne certains trucs comme la réinitialisation de @@ROWCOUNT
qui définitivement n'est pas dans les UDFs, mais comment puis-je trace à travers les appels? Je veux avoir cette trace imprimée, afin que je puisse l'étudier sans se laisser distraire par marcher à travers les appels dans le débogueur...
EDIT: j'ai essayé d'utiliser le générateur de profils SQL (c'était une première fois pour moi), mais je ne peux pas comprendre ce que l'on trace pour: Bien que je peux obtenir la trace à la sortie de la les requêtes adressées à la base de données, ils sont opaques dans le sens que je ne peux pas descendre à l'Expression-Udf appelle: je trace la réelle Procédure Stockée appelée, mais l'Udf appelle par la présente procédure ne sont pas répertoriés. Ai-je raté quelque chose? Je ne crois pas...
EDIT #2: bien que les (auto-)a accepté de répondre à n'trace les appels de fonction très utile, merci - ça n'aide pas à trouver quels sont les paramètres qui ont été passé à la fonction. Ceci, bien sûr, est essentiel dans de débogage fonctions récursives. Je vais poster si je trouve un solution à tous les...
- Yep, découvrez la réponse de Matthieu ci-dessous, qui explique quels sont les événements que vous souhaitez ajouter à votre générateur de profils de configuration. Par défaut, il ne saisit que quelques événements, et ils ne sont pas ceux dont vous avez besoin pour votre dépannage.
Vous devez vous connecter pour publier un commentaire.
Pourquoi ne pas utiliser le générateur de profils SQL avec la déclaration des événements au niveau ajoutée?
Modifier: Ajouter des événements pour les Procédures Stockées : SP:Stmt de Départ ou SP:Stmt Terminé
Utiliser des variables pour debug si nécessaire, c'est à dire set @debug='je suis là'; UDF de, tout n'est pas techniquement des procédures stockées, sera tracée niveau de la déclaration des événements.
Dans le générateur de profils SQL, vous devez: SP:Départ, SP:StmtStarting, SP:, SQL:BatchStarting. Ensuite, vous obtenez chaque entrée, la sortie de l'fonctions/procédures stockées.
avec ceci, j'obtiens:
est-ce suffisant pour vous?
Cette ressemble à ce que vous avez besoin, mais il est uniquement disponible en équipe/pro versions de Visual Studio.
Utilisation du générateur de profils SQL, je vous recommande d'aller à la mer sur l'ajout d'événements de la première fois qui vous permettra d'avoir une idée de ce dont vous avez besoin. Sans tester, je voudrais ajouter les événements de la SP:StmtStarted (ou Complétés ou les deux), SQL:StmtStarted (encore une fois Complété, ou les Deux).
Je seconde le générateur de profils SQL suggestion. Prenez le temps de le configurer de sorte que seuls les événements qui vous intéressent sont connecté pour couper la taille de sortie. Vous pouvez exporter la trace dans un fichier, je l'ai souvent chargé que fichier dans une table pour permettre l'analyse. (très pratique pour l'analyse de performances, mais pas de doute que quelqu'un va me dire que 2008 a cet ensemble construit en somwehere...)
Parfois, vous n'avez pas les autorisations pour exécuter SQL Profiler comme il le fait de ralentir le serveur de bas - demandez à votre DBA pour vous accorder une autorisation sur votre serveur de Dev. Ils ne devraient pas avoir de problèmes avec ça.
Bien dans le passé, j'ai dû prendre des valeurs typiques qui serait à l'UDF, puis exécutez simplement l'udf partie dans une autre fenêtre requête en tant que droit SQL pas un udf en utilisant les valeurs typiques comme les variables définies avec une déclarer et une instruction set. Si elle est exécutée à partir d'une table au lieu d'avoir une seule valeur, j'ai créer une table temporaire ou une variable de table avec les valeurs d'entrée et de les exécuter à travers le sql dans l'UDF (mais encore une fois en tant que droit SQL pas un UDF) par l'intermédiaire d'un curseur. En exécutant directement SQL, vous pourriez avoir des instructions d'impression, pour voir ce qui se passe. Je sais que c'est une douleur, mais il fonctionne. (Je vais) des nouvelles par le biais d'un processus lors de la création/le débogage des déclencheurs, le programme d'installation #inséré et #supprimée avec mes valeurs de test et de tester le code que j'ai l'intention de mettre sur le déclencheur, puis mondial remplacer le # par rien et ajouter le create trigger code.)
Peut-être que vous pouvez utiliser SQL CLR pour tracer l'image comme décrit ici
Comment se connecter en T-SQL
Pouvez-vous prendre votre fonction et de faire une deuxième copie de celui-ci, mais le retour d'un type de table avec une colonne supplémentaire pour vos informations de débogage.
Par exemple, la mySum fonction ci-dessous
Serait à son tour tenu
Pas une solution idéale, mais elle est utile seulement pour retrouver un peu de texte pour aider à traquer un bug.
J'utilise SQL ESPION qui fait ce que vous cherchez et plus encore.
SQL ESPION
SQL ESPION de la Documentation sur la Fonctionnalité
SQL ESPION Entrants SQL Sniffer montre entrant le code SQL de chaque connexion (Comprend DDL et DML suivi)
Cette fonctionnalité est conçue pour MS SQL Server 2005\2008, mais fonctionne avec MS SQL Server 2000 dans le champ d'application limité. Il a la capacité d'enregistrer et de faire rapport sur l'arrivée de SQL. Comment utiliser les fonctions: Voir
Divulgation: je suis partie de la SQL ESPION de l'équipe.