J'essaie de déboguer une procédure stockée très longue dans SQL Server 2005, et j'utilise la commande 'print' pour le faire. Le problème est que je ne récupère les messages de SQL Server qu'à la toute fin de mon sproc. J'aimerais pouvoir vider le tampon de messages et voir ces messages immédiatement pendant l'exécution du sproc, plutôt que tout à l'heure. fin.
Utilisez la fonction RAISERROR
:
RAISERROR( 'This message will show up right away...',0,1) WITH NOWAIT
Vous ne devriez pas remplacer complètement toutes vos impressions avec raiserror. Si vous avez une boucle ou un gros curseur quelque part, faites-le une ou deux fois par itération ou même toutes les plusieurs itérations.
Aussi: j'ai d'abord appris à propos de RAISERROR sur ce lien, que je considère maintenant comme la source définitive sur le traitement des erreurs SQL Server et qui mérite vraiment d'être lu:
http://www.sommarskog.se/error- handling-I.html
En me basant sur la réponse de @JoelCoehoorn, mon approche consiste à laisser toutes mes instructions PRINT en place et à les suivre simplement avec l'instruction RAISERROR afin de 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 chaînes, contrairement à RAISERROR. (Ainsi, dans tous les cas, vous avez le même nombre de lignes de code que vous devez 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 à votre place. Cela vous fait gagner du temps s’il s’agit à chaque fois de la même ligne de code, c’est-à-dire qu’il n’est pas nécessaire de le personnaliser pour conserver un texte spécifique ou une variable.
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
OR
RAISERROR (n'Here''s your message...', 0, 1) WITH NOWAIT
Une autre meilleure option consiste à ne pas dépendre de PRINT ou de RAISERROR et à simplement charger vos instructions "print" dans une table ## Temp dans TempDB ou dans une table permanente de votre base de données, ce qui vous donnera une visibilité immédiate des données via une instruction SELECT à partir d'une autre fenêtre. . 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'impression sont pratiques pour les erreurs, mais à l'aide de la table de journalisation, vous pouvez également déterminer le point exact de l'échec en fonction de la dernière valeur consignée pour cette exécution particulière (en supposant que vous suivez le début de l'exécution dans votre table de journalisation.)
Juste pour la référence , si vous travaillez dans des scripts (traitement par lots) et non dans une procédure stockée , le vidage de la sortie est déclenché par la commande 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, exécutée dans SMS ou l’interface graphique utilisateur ou avec sqlcmd.exe, est vidée dans le fichier, stdoutput, fenêtre gui lors de la première instruction GO ou jusqu’à la fin) du script.
Le vidage à 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