Clique no banner para conhecer e adquirir o meu treinamento de Bancos de Dados no Azure

SQLCMD – O utilitário de linha de comando do SQL Server

Post Views 18,001 views
Reading time 5 minutes

Boa noite!

Neste post irei falar um pouco mais sobre o SQLCMD, o utilitário de linha de comando do SQL Server. Enquanto DBA Oracle, eu utilizava apenas o SQL*Plus, que é o utilitário de linha de comando do Oracle, para realizar minhas atividades e achava super prático, leve, possibilidade de criar scripts altamente personalizáveis e de fácil execução (@wait, @locks, etc), uso de processador da máquina 0% e menos de 20 MB de memória.

Conheci o SQLCMD quando eu ia executar alguma atividade nos bancos SQL Server e achava que enviar evidência de execução tirando print de tela do SQL Management Studio era meio estranho. Estava acostumado com o SQL*Plus, onde gerava um spool e toda a saída dos comandos executados e o retorno eram gravados em um arquivo texto de saída, que eu enviava para os solicitantes das atividades como evidência.

Realmente o SQL*Plus é bem mais completo que o SQLCMD, mas isso não tira o mérito do SQLCMD, que me foi de grande ajuda numa demanda onde precisei executar um script SQL de 500 MB para importação de dados numa base SQL Server. Tentei pelo Management Studio umas 10x, mas não carregava o arquivo nem por reza.. A solução foi recorrer ao já conhecido SQLCMD, que fez a atividade com 1 linha de comando, sem problema algum.

Não vou me estender muito, porque realmente existem vários e vários parâmetros do SQLCMD, além de comandos da própria ferramenta para “programar” nela, tipo umas macros, definição de variáveis, etc. Vou focar apenas nos principais recursos. Se você tem vontade de se aprofundar mais, sugiro visitar a página do SQLCMD da Microsoft ou conferir este link (em inglês)

Um outro uso interessante para o SQLCMD, é a execução de script em massa (lote), conforme demonstro no artigo SQL Server – Como executar em batch todos os scripts .sql de uma pasta ou diretório pelo SQLCMD.

 

Parâmetros de conexão

  • -d <banco de dados>: Serve para especificar o nome do banco de dados que o comando será executado. Atualmente esse parâmetro está obsoleto e deve ser desativado em futuras versões, sendo substituído pelo comando USE [banco].
  • -S <servidor>: Serve para especificar o servidor de conexão do SQL Server. Caso você queira se conectar em uma instância que não seja a padrão ou o servidor possui uma porta diferente da padrão (1433), utilize a sintaxe:
    sqlcmd -S <servidor>\<instancia>, <porta>.
    Ex: sqlcmd -S servidor_casa\instanciaTeste, 1453
  • -A: Permite conectar no servidor com uma conexão dedicada para o administrador do banco de dados (Dedicated Administrator Connection – DAC)

 

Parâmetros de login

  • -E: Tenta se conectar ao servidor utilizando o modo de autenticação Windows Authentication. Não é necessário informar o usuário ou senha, uma vez que a conexão é feita utilizando o usuário logado na máquina, que está previamente cadastrado no Active Directory. Se os parâmetros -P ou -U não forem informados, esse parâmetro é utilizado automaticamente.
  • -U <usuario> -P <senha>: Tenta se conectar ao servidor utilizando o modo de autenticação SQL Server Authentication, onde é necessário informar um usuário e senha e esse usuário deve ter sido criado previamente nas diretivas de usuários do servidor (No Management Studio, Security > Logins)

 

Parâmetros de entrada e saída de arquivos

  • -i <arquivo>: Define o arquivo de entrada a ser executado pelo SQLCMD. Caso parte do caminho tenha espaços, utiliza-se aspas (eu sempre utilizo, tendo espaço ou não).
    Ex: sqlcmd -S pc-casa -i “C:\Meus Arquivos\query.sql”
  • -o <arquivo>: Define o arquivo de saída, onde serão gravadas as mensagens de saída retornadas pelo SQLCMD.
  • -e: Define que as queries contidas no arquivo de entrada apareçam no arquivo de saída também.
  • -u: Define que o arquivo de saída será gravado no formato Unicode (UTF-8).

 

Parâmetros de query

  • -q <query>: Executa a query passada por parâmetro (utilize aspas). Para executar mais de uma query, utilize o ponto e vírgula (;). Esse parâmetro não pode ser utilizado em conjunto com o -i, pois eles são mutuamente exclusivos.
  • -Q <query>: Faz a mesma coisa do parâmetro -q, mas após a execução, fecha o SQLCMD.
  • -t <segundos>: Define o tempo de timeout (em segundos) da query que será executada. Após ultrapassar o limite definido, a conexão será encerrada, mesmo que não tenha sido executada por completo ainda.
  • -s <caractere>: Define o caractere separador de colunas.
    Ex: sqlcmd -S pc-casa -s ; -Q “select * from sys.sysobjects”
  • -W: Remove os espaços em branco à direita.

 

Parâmetros de erros

  • -m<nivel de erro>: Define a partir de que nível de severidade de erro, as mensagens serão gravadas no arquivo de saída. Utilizando o parâmetro -1, todas as mensagens, até as informativas, serão gravadas. Esse parâmetro não aceita espaços. -m-1 é válido, mas -m -1 não.
  • -V <nivel de erro>: Define a partir de qual nível de severidade as mensagens retornadas serão tratadas como erro.

 

Parâmetros diversos

  • -?: Exibe o HELP do SQLCMD

 

Exemplos de utilização

Também é possível executar queries normalmente no SQLCMD (aí eu já acho melhor fazer no Management Studio.. rs)

SQLCMD - Exemplo

Definindo a largura máxima em 30 caracteres

SQLCMD - Exemplos

Definindo que não haverão espaços em branco e o separador de colunas será o “;”

SQLCMD - Exemplos

Definindo que não haverão espaços em branco, o separador de colunas será o “;” e sem cabeçalhos

É isso aí pessoal,
Até a próxima!