quinta-feira, 23 de junho de 2016

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

Neste topico irei detalhar um pouco mais sobre o SQLCMD, o utilitário de linha de comando do SQL Server. 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 (da ORACLE), 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)

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:
1
2
3
4
5
6
7
8
9
10
11
-- Conecta no servidor "servidor-casa", utilizando o usuário "damatto", senha "damatto", executa o script "teste.sql" e grava o resultado e o próprio arquivo de entrada no arquivo teste.log
sqlcmd -S servidor-casa -U damatto -P damatto -i "C:\Meus Dados\SQL\teste.sql" -e -o "C:\Meus Dados\SQL\teste.log"
 
-- Conecta no servidor "servidor-casa" utilizando autenticação Windows e executa o script "teste.sql"
sqlcmd -S servidor-casa -i "C:\Meus Dados\SQL\teste.sql"
 
-- Conecta no servidor "servidor-casa", instância "instanciaTeste", porta 1453. Executa uma query no servidor, onde o tempo de expiração é de 60 segundos. O resultado da query virá separado por ";" e não terá espaços em branco.
sqlcmd -S servidor-casa\instanciaTeste,1453 -q "SELECT TOP 10 * FROM sys.sysobjects" -t 60 -s ; -W
 
-- Conecta no servidor "servidor-casa", executa uma query no servidor, onde o tempo de expiração é 30 segundos. O resultado da query virá separado por ";", não terá espaços em branco e será gravado no arquivo "saida.log"
sqlcmd -S servidor-casa -q "SELECT * FROM sys.sysobjects" -t 30 -s ; -W -e -o "C:\saida.log"


 Também é possível executar queries normalmente no SQLCMD











acompanhei no proximo post um exemplo pratico em produçao, 
das funcionalidades mais uteis do SQLCMD ..

update:
http://scriptsemsql.blogspot.com.br/2016/06/executar-em-batch-todos-os-scripts-de.html

Executar em batch todos os scripts de uma pasta SQLCMD - SQL SERVER

Neste post daremos continuidade as funcionalidades do SQLCMD e demonstraremos como executar vários scripts em lote que estão em uma determinada pasta, gerando log de execução, com apenas uma linha de código. Essa instrução é bem simples, e permite uma série de personalizações para atender à sua necessidade.

Acredito que todo DBA e boa parte dos desenvolvedores já precisaram executar vários scripts SQL de forma prática e rápida, não se esquecendo de nenhum e ainda logando as operações para eventuais questionamentos. Essa atividade é muito comum e diariamente precisamos executar uma serie de scripts em sequencia.
E é claro que eu não iria executá-los um por um manualmente..

Para essa solução, vou utilizar a linguagem do Prompt de comando do Windows (CMD.exe) e SQLCMD, o utilitário de linha de comando do SQL Server.

Lembre-se que como responsabilidade de todo DBA, você deve avaliar e validar todos os scripts que lhe são enviados para serem executados, preferencialmente em um ambiente de testes, desenvolvimento e/ou pré-produção. Não utilize a solução apresentada aqui para executar vários scripts em batch diretamente na produção sem ao menos tê-los testado em um ambiente de testes antes.

Exemplo:















Criaremos um arquivo .BAT no diretório dos seus scripts 
(Neste exemplo, vou usar o nome “Executa Scripts.bat”) com o seguinte comando:

2
for %%G in (*.sql) do sqlcmd /S localhost\sql2014 /d Testes -E -i"%%G" >> Teste.log
pause


Detalhes, onde:

/S: define o servidor\instância onde os scripts serão executados
/d: define o database onde os scripts serão executados
-E: especifica que o modo de autenticação será o Trusted Connection (Autenticação Windows AD). Caso você queira utilizar autenticação SQL, utilize -Uusuario e -Psenha

-i: especifica o arquivo de entrada que contém os comandos que serão executados







Reparem que nessa solução, o log é gerado com o resultado da execução de cada script, sem informação de data e hora e sem separação entre os scripts. Com isso, os resultados não ficam muito organizados dentro do arquivo. Se você não se preocupa muito com a saída do log, pode utilizar essa solução tranquilamente.


Exemplo do log de execução:

segunda-feira, 13 de junho de 2016

Microsoft compra rede social LinkedIn por US$ 26 bi; OFF-Topic


        Por US$ 26,2 bilhões (cerca de R$ 94 bilhões), a Microsoft comprou a rede social de currículos e vagas, o LinkedIn. Ainda restam alguns detalhes burocráticos até o acordo ser finalizado, o que deve acontecer até o final do ano, mas as duas companhias já se posicionaram. Para o usuário final, porém, pouca coisa deve mudar a curto prazo na rede também procurada por quem está em busca de empregos.

Jeff Weiner, CEO LinkedIn, afirmou, em um post no blog oficial da rede social para profissionais e vagas de emprego, que o site manterá marca e funcionamento. Weiner também segue como líder executivo. Além disso, em uma publicação mais pessoal, no seu perfil de influenciador, o executivo revelou a íntegra de um e-mail que mandou para os funcionários do LinkedIn em todo o mundo. Nesse texto, detalhou algumas das possíveis novidades que estão por vir; saiba o que muda na rede social.

Executivos de LinkedIn e Microsoft: Jeff Weiner, CEO do LinkedIn, Satya Nadella, CEO da Microsoft e Reid Hoffman, cofundador e controlador de ações do LinkedIn (Foto: REprodução/Microsoft)


“Pense nas coisas que o LinkedIn pode fazer integrado ao Outlook, Calendar, Active Directory, Microsoft Office, Windows, Skype, Dynamics, Cortana, Bing e muito mais”, escreveu o executivo, dando uma pista das novidades que podem chegar ao LinkedIn quando de fato fizer parte da nuvem da Microsoft.

Weiner disse ainda que integrar o serviço de ensino Lynda aos produtos Microsoft, como o Microsoft Office, criar novas soluções inovadoras, oferecer conteúdos patrocinados para alcançar os usuários da Microsoft, redefinir o sistema de venda social e usar as capacidades de assinaturas do LinkedIn para oferecer ainda mais oportunidades para freelancers e produtores independentes que usam os apps da Microsoft diariamente são alguns dos seus objetivos.

LinkedIn segue independente.


“O Satya (Satya Nadella, CEO da Microsoft) me convenceu quando disse que teríamos independência. Em outras palavras, sua visão é de que o LinkedIn opere totalmente por si só, dentro da Microsoft, em um modelo usado em companhias de sucesso como YouTube, Instagram e WhatsApp”, relatou.


O LinkedIn tem números impressionantes, que justificam o valor investido nele (o maior já pago pela Microsoft em uma aquisição): 19% de crescimento ano após ano, com 433 milhões de usuários cadastrados no mundo todo, 9% de crescimento para mais de 105 milhões de visitas únicas de membros por mês, além de 34% de crescimento para mais de 45 bilhões de pageviews por trimestre. Sem falar nos sete milhões de empregos listados na página. E a Microsoft pensa que tudo isso pode ajudar muito no projeto Microsoft Office.

“O time do LinkedIn criou um negócio fantástico, que conecta os profissionais do mundo. Juntos, podemos acelerar o crescimento do LinkedIn, assim como do Microsoft Office 365, enquanto buscamos oferecer a cada pessoa e organização do planeta mais poder”, afirmou Nadella.Recentemente, a Microsoft demonstrou todo o seu interesse em desenvolver ainda mais conteúdo voltado para a área de negócios (business). Afinal, o Pacote Office é um de seus principais produtos, e o Office 365, na nuvem, totalmente online, vem ganhando cada vez mais funcionalidades. Além disso, a empresa comprou nos últimos meses os serviços Sunrise e Wunderlist.Ainda não há nenhuma informação concreta de possíveis integrações ou novas funções ao LinkedIn. 

Um redesign, por exemplo, é bastante aguardado por muita gente que considera o visual da rede social longe do ideal. Integrações aos programas do Office, e principalmente o Office 365, também já são esperadas. Resta agora esperar os próximos passos desta junção de gigantes.