Comment vider le tampon PRINT dans TSQL?

J'ai une procédure stockée très longue dans SQL Server 2005 que j'essaie de déboguer et j'utilise la command 'print' pour le faire. Le problème est, je reçois seulement les messages de SQL Server à la fin de mon sproc – j'aimerais pouvoir vider le tampon de message et voir ces messages immédiatement pendant l'exécution de sproc, plutôt qu'à la fin.

Utilisez la fonction RAISERROR :

 RAISERROR( 'This message will show up right away...',0,1) WITH NOWAIT 

Vous ne devriez pas replace complètement toutes vos printings avec raiserror. Si vous avez une boucle ou un grand slider quelque part, faites-le une ou deux fois par itération ou même toutes les itérations.

Aussi: J'ai d'abord appris sur RAISERROR à ce lien, que je considère maintenant comme la source définitive sur la gestion des erreurs SQL Server et mérite certainement une lecture:
http://www.sommarskog.se/error-handling-I.html

Oui … Le premier paramètre de la fonction RAISERROR nécessite une variable NVARCHAR. Alors, essayez ce qui suit:

 -- Replace PRINT function DECLARE @strMsg NVARCHAR(100) SELECT @strMsg = 'Here''s your message...' RAISERROR (@strMsg, 0, 1) WITH NOWAIT 

OU

 RAISERROR (n'Here''s your message...', 0, 1) WITH NOWAIT 

Une autre meilleure option est de ne pas dépendre de PRINT ou RAISERROR et de simplement charger vos instructions "print" dans une table ## Temp dans TempDB ou une table permanente dans votre database qui vous donnera une visibilité immédiate via une instruction SELECT depuis une autre window . Cela fonctionne le mieux pour moi. L'utilisation d'une table permanente sert également de journal à ce qui s'est passé dans le passé. Les instructions d'printing sont pratiques pour les erreurs, mais en utilisant la table de journalisation, vous pouvez également déterminer le sharepoint défaillance exact en fonction de la dernière valeur enregistrée pour cette exécution particulière (en supposant que vous suiviez l'heure de début de l'exécution).

Juste pour la reference, si vous travaillez dans des scripts (traitement par lots), pas dans la procédure stockée , la sortie de vidage est déclenchée par la command GO, par exemple

 print 'test' print 'test' go 

En général, ma conclusion est la suivante: la sortie de l'exécution du script mssql, s'exécutant dans SMS GUI ou avec sqlcmd.exe, est vidée dans le file, stdoutput, window gui sur la première instruction GO ou jusqu'à la fin du script.

Le rinçage à l'intérieur de la procédure stockée fonctionne différemment, car vous ne pouvez pas placer GO à l'intérieur.

Référence: déclaration tsql Go

Sur la base de la réponse de @JoelCoehoorn, mon approche est de laisser toutes mes instructions PRINT en place, et de les suivre simplement avec l'instruction RAISERROR pour provoquer le flush.

Par exemple:

 PRINT 'MyVariableName: ' + @MyVariableName RAISERROR(N'', 0, 1) WITH NOWAIT 

L'avantage de cette approche est que les instructions PRINT peuvent concaténer des strings, contrairement au RAISERROR. (Donc de toute façon vous avez le même nombre de lignes de code, que vous auriez à déclarer et définir une variable à utiliser dans RAISERROR).

Si, comme moi, vous utilisez AutoHotKey ou SSMSBoost ou un outil équivalent, vous pouvez facilement configurer un raccourci tel que "] flush" pour entrer la ligne RAISERROR pour vous. Cela vous fait gagner du time si c'est la même ligne de code à chaque fois, c'est-à-dire qu'elle n'a pas besoin d'être personnalisée pour contenir du text spécifique ou une variable.