Comment faire pour que SQLCMD affiche uniquement les erreurs et les avertissements?

8

Comment pouvez-vous obtenir SQLCMD, lors de l'exécution d'un fichier de script SQL, pour simplement afficher les erreurs ou avertissements qu'il rencontre?

Je ne veux essentiellement pas que des messages basés sur des informations soient générés.

bytedev
la source
Hmm, dans une autre application, nous pourrions rediriger la sortie d'erreur 2> Err.txt, mais il semble que SQLCMDcela ne divise pas sa sortie.
Jon of All Trades
2
@JonofAllTrades Par défaut oui, SQLCMD envoie toutes les sorties à stdout . Cependant, vous pouvez demander à SQLCMD d'envoyer des erreurs à stderr via le -r0commutateur de ligne de commande, auquel cas elles peuvent être redirigées vers un fichier à l'aide de 2>, ou elles peuvent être affichées pendant que les messages normaux sont redirigés via >. Veuillez consulter ma réponse pour plus de détails.
Solomon Rutzky

Réponses:

4

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 -rcommutateur de ligne de commande, en spécifiant 0comme 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 NULmot - clé (qui n'est pas un typeo: il en a un L, pas deux) qui fonctionne comme /dev/nullsous Unix. Signifie que vous pouvez utiliser ce qui suit pour rediriger la sortie vers nulle part: > NUL.

Ce qui suit exécutera la PRINTcommande 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 PRINTcommande:

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.
Solomon Rutzky
la source
1

Les éléments suivants fonctionneront:

sqlcmd -U user -P pass -S Server -Q "sp_who" -r0 1> test.log

Le résultat de la requête sera mis dans le journal et rien ne sera imprimé à l'écran.

Plus de détails sur l' article MSDN sur sqlcmd .

LowlyDBA
la source
Cela ne fonctionne pas réellement selon le "Je ne veux essentiellement pas que les messages basés sur les informations soient émis" (c'est moi qui souligne). Le problème est que -r1envoie tous les messages à stderr , y compris PRINTet RAISERROR('', 10, 1)messages. Vous devez utiliser -r0pour conserver ces messages d'information réguliers sur stdout de sorte qu'ils soient redirigés vers test.log .
Solomon Rutzky du
1
@srutzky Merci d'avoir modifié ma réponse pour refléter votre commentaire.
LowlyDBA
0

Trouvé ceci sur SQLServerCentral

sqlcmd -E -i"install.sql" -r1 2> install-err.log 1> install.log

http://www.sqlservercentral.com/Forums/Topic536968-146-1.aspx

Alf47
la source
Cela ne fonctionne pas réellement selon le "Je ne veux essentiellement pas que les messages basés sur les informations soient émis" (c'est moi qui souligne). Le problème est que -r1envoie tous les messages à stderr , y compris PRINTet RAISERROR('', 10, 1)messages. Vous devez utiliser -r0pour conserver ces messages d'information réguliers sur stdout de sorte qu'ils soient redirigés vers install.log .
Solomon Rutzky