Olá pessoal,
Boa noite!
Neste post vou demonstrar 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 hoje mesmo precisei exportar algumas SP’s e funções de um banco para o outro, gerando 174 scripts SQL (sempre crio 1 por objeto). 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 o 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 básico
Crie um arquivo .BAT no diretório dos seus scripts (Neste exemplo, vou usar o nome “Executa Scripts.bat”) com o seguinte comando:
1 2 |
for %%G in (*.sql) do sqlcmd /S localhost\sql2014 /d Testes -E -i"%%G" >> Execucao.log pause |
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 avançado:
Para quem gosta um pouco mais de organização nos logs de execução, vou disponibilizar também uma solução mais avançada um pouco, criando um log de execução bem bacana. Além disso, adicionei o parâmetro -e (se você não gostar, pode remover), que exibe além do resultado dos scripts executados, o conteúdo do próprio script, para evidenciar ainda mais a execução.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
setlocal enableDelayedExpansion @echo off ECHO. > "Execucao.log" for %%G in (*.sql) do ( ECHO -------------------------------------------------------- >> "Execucao.log" ECHO !DATE! !TIME! Executando o script "%%G"... >> "Execucao.log" ECHO -------------------------------------------------------- >> "Execucao.log" ECHO. >> "Execucao.log" sqlcmd /S localhost\SQL2014 /d Testes -E -e -i"%%G" >> "Execucao.log" ECHO. >> "Execucao.log" ECHO Fim da execucao: !DATE! !TIME! >> "Execucao.log" ECHO -------------------------------------------------------- >> "Execucao.log" ECHO. >> "Execucao.log" ECHO. >> "Execucao.log" ) PAUSE |
Obrigado pela visita e até o próximo post!
Abraço.
sql server executar script em lote vários scripts arquivos de uma pasta sqlcmd batch execute processing
sql server executar script em lote vários scripts arquivos de uma pasta sqlcmd batch execute
Boa tarde!
Tenho um scrip que roda normal quando as datas sao inseridas manualmente, mas como tem varios
campos de datas e possivel eu criar uma variavel para o arquivo buscar essa data?
Ola como vai gostaria que me ajuda se se poder.
Adaptei esse código abaixo para rodar script no banco de dados porem eu gostaria de fazer ele perguntar quando der erro se quero continuar, tentar novamente ou sair
@echo off
chcp 1252
SET ds_Instancia=.
SET ds_UseDatabase=cin2
SET ds_DirRaiz=%CD%
rem reset errorlevel para zero
ver >nul
cls
echo. ——————————-
echo. Iniciando execucao de scripts
echo. ——————————-
echo.
echo.
for /R %%j in (*.sql) do (
echo == Executando: %%j
SQLCMD -b -i “%%j” -S %ds_Instancia% -E -d %ds_UseDatabase% -o “%ds_DirRaiz%\Result.txt”
if errorlevel 1 (
echo !!!ERRO!!!
echo ERRO: %%j >> “%ds_DirRaiz%\log_Scripts_Executados.txt”
echo ERRO: %%j >> “%ds_DirRaiz%\log_Scripts_Executados_Detalhe.txt”
if exist “%ds_DirRaiz%\Result.txt” copy “%ds_DirRaiz%\Result.txt” “%%j.erro.txt”
) else (
echo OK
echo OK: %%j >> “%ds_DirRaiz%\log_Scripts_Executados.txt”
echo OK: %%j >> “%ds_DirRaiz%\log_Scripts_Executados_Detalhe.txt”
)
echo.
if exist “%ds_DirRaiz%\Result.txt” type “%ds_DirRaiz%\Result.txt” >> “%ds_DirRaiz%\log_Scripts_Executados_Detalhe.txt”
echo. >> “%ds_DirRaiz%\log_Scripts_Executados_Detalhe.txt”
)
del “%ds_DirRaiz%\Result.txt”
echo. ——————————-
echo. Concluido!
echo. ——————————-
echo.
echo.
echo.
Pause
Sera que pode me ajudar
Grande mestre, blz? acho que seria legal uma versão PowerShell desse script. ?
Perfeito! Rodei um comando de 24mil linhas em muito pouco tempo! Parabéns!
Muito obrigado, ajudou e muito aqui para automatizar execução de scripts no cliente. Bom trabalho, parabéns.
Bom dia
Como faço pra exportar apenas o retorno do comando?
Como faz para retornar apenas as linhas que teve erro?
Meu código está assim, porem só quero retornar aquilo que deu problema não tudo
for %%G in (*.sql) do (
ECHO ———————————————————
ECHO ———– Inicio da execucao: !DATE! !TIME! ———–
ECHO ———– Executando o script “%%G”…
sqlcmd -S alphasfdb02\dese -i “%%G”
ECHO ———– Fim da execucao: !DATE! !TIME! ————–
ECHO ———————————————————
ECHO.
)
Geovani,
Boa tarde.
Creio que não seja possível, pois o Prompt do DOS (cmd) não possui nenhum tratamento de erros e exceções dos comandos SQL para identificar se o comando sqlcmd apresentou erro ou não.
Entretanto, é possível modificar a saída do sqlcmd utilizando o parâmetro -r0 e gravar as mensagens de erro e warnings em um arquivo separado, conforme demonstrado nesse link: http://dba.stackexchange.com/questions/20096/how-to-get-sqlcmd-to-output-errors-and-warnings-only
Qualquer dúvida, estou à disposição.
Olá gostaria de saber como adicionar na bat a ordem de execução dos scripts.
De qualquer forma já ajudou mto
Cassia,
Bom dia e obrigado pela visita.
Como se trata de um script do DOS, o que se pode fazer para definir a ordem de execução é usar a ordenação pelo nome do arquivo ou pela data de criação/modificação. No caso deste exemplo, os scripts serão executados ordenando pelo nome do arquivo. Geralmente quando eu tenho uma ordem pré definida de execução, eu enumero os arquivos. Se for só alguns scripts, você pode colocar algum caractere na frente do nome para garantir que eles sejam ordenados primeiro.
Ordenar pela data é possível, mas não acho que seja uma boa estratégia. De qualquer forma, vou postar como fazer isso.
Bom dia!!
Agora vou parar de ficar executar script por script quando tenho que atualizar a estrutura de uma base de dados. 😀
Obrigado pela solução.