serveur sql – Comment déboguer des procédures stockées avec des instructions d'impression? – Bien choisir son serveur d impression
[bzkshopping keyword= »Minecraft » count= »8″ template= »grid »]
Avant d'en arriver à ma réponse réitérée; J'avoue que la seule réponse que j'accepterais ici est celle de KM. au dessus de. J'ai voté contre les autres réponses parce qu'aucune d'entre elles n'a répondu à la question posée ou qu'elles n'étaient pas adéquates. La sortie PRINT apparaît effectivement dans la fenêtre Message, mais ce n'est pas du tout ce qui a été demandé.
Pourquoi la sortie de l'instruction PRINT ne s'affiche-t-elle pas pendant l'exécution de ma procédure stockée?
La version courte de cette réponse est que vous envoyez l'exécution de votre sproc au serveur SQL et il ne répondra pas tant qu'il n'aura pas terminé la transaction entière. Voici une meilleure réponse située sur ce lien externe.
- Pour encore plus d'opinions / observations, concentrez votre attention sur cet article SO ici.
- Regardez plus précisément cette réponse du même post par Phil_factor (Ha ha! Love the SQL humour)
- En ce qui concerne la suggestion d'utiliser RAISERROR WITH NOWAIT, regardez cette réponse du même message par JimCarden
Ne fais pas ces choses
- Certaines personnes ont l'impression qu'elles peuvent simplement utiliser une instruction GO après leur instruction PRINT, mais vous NE POUVEZ PAS utiliser l'instruction GO INSIDE d'un sproc. Donc, cette solution est sortie.
- Je ne recommande pas SELECT-ing vos instructions d'impression car cela va juste brouiller votre jeu de résultats avec des absurdités et si votre sproc est censé être consommé par un programme plus tard, vous devrez savoir quels jeux de résultats ignorer lors de la boucle à travers les résultats de votre lecteur de données. C'est juste une mauvaise idée, alors ne le faites pas.
- Un autre problème avec SELECT-ING vos instructions d'impression est qu'elles n'apparaissent pas toujours immédiatement. J'ai eu différentes expériences avec cela pour différentes exécutions, alors ne vous attendez pas à une quelconque cohérence avec cette méthodologie.
Alternative à IMPRIMER à l'intérieur d'une procédure stockée
À mon avis, c'est vraiment une sorte de travail dégoûtant parce que la syntaxe est déroutante dans le contexte dans lequel elle est utilisée, mais qui sait peut-être qu'elle sera mise à jour à l'avenir par Microsoft. Je n'aime tout simplement pas l'idée de générer une erreur dans le seul but d'imprimer les informations de débogage …
Il semble que le seul moyen de contourner ce problème est d'utiliser, comme cela a déjà été expliqué à plusieurs reprises, RAISERROR WITH NOWAIT. Je donne un exemple et souligne un petit problème avec cette approche:
MODIFIER
--CRÉER
PROCÉDURE [dbo].[PrintVsRaiseErrorSprocExample]
COMME
COMMENCER
SET NOCOUNT ON;
- Cela imprimera immédiatement
RAISERROR ('RE Start', 0, 1) AVEC NOWAIT
SELECT 1;
- Délai de cinq secondes pour simuler une exécution longue
RETARD D'ATTENTE '00: 00: 05 '
- Cela s'imprimera après le délai de cinq secondes
RAISERROR ('RE End', 0, 1) AVEC NOWAIT
SELECT 2;
FIN
ALLER
EXEC [dbo].[PrintVsRaiseErrorSprocExample]
Les deux résultats de l'instruction SELECT ne s'afficheront qu'une fois l'exécution terminée et le impression les instructions s'afficheront dans l'ordre indiqué ci-dessus.
Problème potentiel avec cette approche
Supposons que vous ayez à la fois votre instruction PRINT et votre instruction RAISERROR l'une après l'autre, puis elles s'impriment toutes les deux. Je suis sûr que cela a quelque chose à voir avec la mise en mémoire tampon, mais sachez simplement que cela peut arriver.
MODIFIER
--CRÉER
PROCÉDURE [dbo].[PrintVsRaiseErrorSprocExample2]
COMME
COMMENCER
SET NOCOUNT ON;
- Les instructions PRINT et RAISERROR afficheront
IMPRIMER 'P Démarrer';
RAISERROR ('RE Start', 0, 1) AVEC NOWAIT
SELECT 1;
RETARD D'ATTENTE '00: 00: 05 '
- Les instructions PRINT et RAISERROR afficheront
IMPRIMER 'P Fin'
RAISERROR ('RE End', 0, 1) AVEC NOWAIT
SELECT 2;
FIN
ALLER
EXEC [dbo].[PrintVsRaiseErrorSprocExample2]
Par conséquent, le travail ici est, n'utilisez pas à la fois PRINT et RAISERROR, choisissez simplement l'un sur l'autre. Si vous voulez que votre sortie s'affiche pendant l'exécution d'un sproc, utilisez RAISERROR WITH NOWAIT.
Commentaires
Laisser un commentaire