Por padrão, o SQLCMD envia todas as mensagens de erro e não para stdout . Portanto, tentar redirecionar a saída não ajudará.
A primeira coisa que você precisa fazer para obter apenas um ou outro tipo de mensagem (erro ou não) é dizer ao SQLCMD para separá-las enviando as mensagens de erro (nível de gravidade 11 ou superior) ao stderr . Você faz isso usando a -r
opção de linha de comando, especificando 0
como a opção para essa opção (ou seja -r0
). Nesse ponto, não há diferença visível em termos de execução do SQLCMD e de visualização de mensagens de qualquer tipo exibidas na tela.
A próxima parte é filtrar as mensagens regulares que vão para o stdout . Isso pode ser feito redirecionando as mensagens stdout para algum lugar via >
, mas para onde? Você poderia > file.txt
, mas duvido que queira um arquivo com as mensagens com as quais não queria começar. Felizmente, o DOS tem a NUL
palavra - chave (que não é um tipo: tem um L
, não dois) que funciona como /dev/null
no Unix. Ou seja, você pode usar o seguinte para a saída de redirecionamento para lugar nenhum: > NUL
.
A seguir, o PRINT
comando será executado e não será exibido, pois nenhum erro é gerado e nenhum arquivo é criado que contenha a saída do PRINT
comando:
CD %TEMP%
SQLCMD -E -Q "print 1;" -r0 > NUL
Mas o seguinte exibe uma mensagem de erro, pois essas não estão sendo redirecionadas para NUL
:
CD %TEMP%
SQLCMD -E -Q "print a;" -r0 > NUL
Devoluções:
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
, mas parece queSQLCMD
ela não divide sua saída.