Par défaut, SQLCMD envoie tous les messages non d'erreur et les messages d'erreur à stdout . Par conséquent, tenter de rediriger la sortie n'aidera pas.
La première chose que vous devez faire pour obtenir uniquement l'un ou l'autre type de messages (erreur ou non) est de dire à SQLCMD de les séparer en envoyant les messages d'erreur (niveau de gravité 11 ou supérieur) à stderr . Pour ce faire, utilisez le -r
commutateur de ligne de commande, en spécifiant 0
comme option pour ce commutateur (c'est-à-dire -r0
). À ce stade, il n'y a aucune différence visible en termes d'exécution de SQLCMD et de voir les messages de tout type affichés à l'écran.
La partie suivante consiste à filtrer les messages réguliers envoyés à stdout . Cela peut être fait en redirigeant les messages stdout vers quelque part via >
, mais où? Vous pourriez le faire > file.txt
, mais je doute que vous vouliez un fichier des messages que vous ne vouliez pas commencer. Heureusement, DOS a le NUL
mot - clé (qui n'est pas un typeo: il en a un L
, pas deux) qui fonctionne comme /dev/null
sous Unix. Signifie que vous pouvez utiliser ce qui suit pour rediriger la sortie vers nulle part: > NUL
.
Ce qui suit exécutera la PRINT
commande et n'affichera aucune sortie car aucune erreur n'est générée et aucun fichier n'est créé qui contiendrait la sortie de la PRINT
commande:
CD %TEMP%
SQLCMD -E -Q "print 1;" -r0 > NUL
Mais ce qui suit affiche un message d'erreur car ceux-ci ne sont pas redirigés vers NUL
:
CD %TEMP%
SQLCMD -E -Q "print a;" -r0 > NUL
Retour:
Msg 128, Level 15, State 1, Server DALI, Line 1
The name "a" is not permitted in this context. Valid expressions are constants,
constant expressions, and (in some contexts) variables. Column names are not permitted.
2> Err.txt
, mais il semble queSQLCMD
cela ne divise pas sa sortie.