Serveur d'impression

serveur sql – Comment déboguer des procédures stockées avec des instructions d'impression? – Bien choisir son serveur d impression

Le 5 février 2021 - 4 minutes de lecture


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

  1. 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.
  2. 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.
  3. 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

Votre commentaire sera révisé par les administrateurs si besoin.