Como fazer com que o SQLCMD produza apenas erros e avisos?

8

Como você pode obter o SQLCMD, ao executar um arquivo de script SQL, para gerar apenas erros ou avisos encontrados?

Eu essencialmente não quero que as mensagens baseadas em informações sejam exibidas.

bytedev
fonte
Hmm, em outro aplicativo, poderíamos redirecionar a saída de erro 2> Err.txt, mas parece que SQLCMDela não divide sua saída.
Jon of All Trades
2
@JonofAllTrades Por padrão, sim, o SQLCMD envia toda a saída para o stdout . No entanto, você pode instruir o SQLCMD a enviar erros ao stderr por meio da -r0opção de linha de comando; nesse caso, eles podem ser redirecionados para um arquivo usando 2>ou podem ser exibidos enquanto mensagens regulares são redirecionadas por >. Por favor, veja minha resposta para detalhes.
Solomon Rutzky 12/08/15

Respostas:

4

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 -ropção de linha de comando, especificando 0como 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 NULpalavra - chave (que não é um tipo: tem um L, não dois) que funciona como /dev/nullno Unix. Ou seja, você pode usar o seguinte para a saída de redirecionamento para lugar nenhum: > NUL.

A seguir, o PRINTcomando será executado e não será exibido, pois nenhum erro é gerado e nenhum arquivo é criado que contenha a saída do PRINTcomando:

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

O seguinte funcionará:

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

A saída da consulta será colocada no log e nada será impresso na tela.

Mais detalhes no artigo do MSDN sobre sqlcmd .

LowlyDBA
fonte
Na verdade, isso não funciona de acordo com o solicitado "Eu essencialmente não quero que as mensagens baseadas em informações sejam exibidas" (ênfase minha). O problema é que -r1envia todas as mensagens para o stderr , incluindo PRINTe RAISERROR('', 10, 1)messages. Você precisa usar -r0para manter essas mensagens informativas regulares em stdout, de modo que elas sejam redirecionadas para test.log .
Solomon Rutzky
11
@srutzky Obrigado, modifiquei minha resposta para refletir seu comentário.
precisa saber é o seguinte
0

Encontrei isso no SQLServerCentral

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

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

Alf47
fonte
Na verdade, isso não funciona de acordo com o solicitado "Eu essencialmente não quero que as mensagens baseadas em informações sejam exibidas" (ênfase minha). O problema é que -r1envia todas as mensagens para o stderr , incluindo PRINTe RAISERROR('', 10, 1)messages. Você precisa usar -r0para manter essas mensagens informativas regulares em stdout, de modo que elas sejam redirecionadas para install.log .
Solomon Rutzky 12/08/15