web-dev-qa-db-fra.com

Comment vider le tampon d'impression dans SQL?

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.

207
Erik Forbes

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

294
Joel Coehoorn

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.

19
Mike

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
17
tcbrazil

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.)

11
Eric Isaacs

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

4
Robert Lujo