Executar todos os arquivos SQL em um diretório


117

Tenho vários arquivos .sql que preciso executar para aplicar as alterações feitas por outros desenvolvedores em um banco de dados SQL Server 2005. Os arquivos são nomeados de acordo com o seguinte padrão:

0001 - abc.sql
0002 - abcef.sql
0003 - abc.sql
...

Existe uma maneira de executar todos eles de uma vez?

Respostas:


143

Crie um arquivo .BAT com o seguinte comando:

for %%G in (*.sql) do sqlcmd /S servername /d databaseName -E -i"%%G"
pause

Se você precisar fornecer nome de usuário e senha

for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P 
password -i"%%G"

Observe que o "-E" não é necessário quando o usuário / senha é fornecido

Coloque este arquivo .BAT no diretório a partir do qual deseja que os arquivos .SQL sejam executados, clique duas vezes no arquivo .BAT e pronto!


2
quando executei o arquivo em lote, ocorreu um problema de autenticação dizendo "Falha no login. O login é de um domínio não confiável e não pode ser usado com a autenticação do Windows.". Existe uma maneira de fornecer nome de usuário e senha também como nome de servidor e banco de dados?
Sanjay Maharjan

11
@SanjayMaharjan use -U para usuário e -P para senha, como:for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P "password" -i"%%G"
Rickedb

Como posso colocar a saída em arquivos separados usando -o? sempre que eu uso como -o temp.txt, este temp.txt é sobrescrito. Eu quero obter os arquivos de saída com o mesmo nome de arquivo sql.
kevin

@vijeth: bom trabalho, cara. Eu estava pensando em fazer um por um cerca de 200 arquivos sql. economizou muito tempo
Uthistran Selvaraj

@Vijeth, obrigado. acabei de modificar por mim mesmo: apenas ambiente de desenvolvimento REM REM !! Pausa REM para %% G em (* .sql) do sqlcmd / S "192.168.10.139 \ SQLEXPRESS" / d "TESTDEV_DB" -U "atiour" -P "atiour" -i "%% G" pausa REM REM Todo o script Executar REM
atik sarker

71

Use FOR . No prompt de comando:

c:\>for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f"

2
Tive que adicionar aspas em torno do último "% f" para fazê-lo funcionar com scripts que continham espaços
Steve Wright

Para obter uma versão que funciona em arquivos em lote, consulte esta resposta .
Ian Kemp

Eu também tive que adicionar alguns outros parâmetros (por exemplo, / I para habilitar identificadores entre aspas)
Pavel K

eu gosto deste - mas existe alguma maneira de ter a saída dos resultados em um arquivo? para que eu possa ver facilmente quaisquer exceções? Acabei de tentar este comando em 136 arquivos .sql, então perdi a visibilidade da maioria deles
Rich

2
@Rich Para redirecionar a saída para o arquivo, use este comando: for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f" >> sql.log 2>&1) Você pode ler mais sobre o redirecionamento da saída aqui
danijelk 01 de

26
  1. No SQL Management Studio, abra uma nova consulta e digite todos os arquivos conforme abaixo

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  2. Vá para o menu Consulta no SQL Management Studio e certifique-se de que o modo SQLCMD esteja ativado
  3. Clique em Modo SQLCMD; os arquivos serão selecionados em cinza como abaixo

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  4. Agora execute

3
isso é realmente tedioso se eu tiver centenas de arquivos.
devlin carnate

1
@devlincarnate: Presumivelmente, você pode criar uma maneira de automatizar a etapa 1. Como "dir / B * .sql> list.txt" e, em seguida, massagear um pouco esse arquivo list.txt.
Jeff Roe

@devlincarnate em versões mais recentes do Windows, você pode manter pressionada a tecla Shift, clicar com o botão direito em um arquivo e selecionar "Copiar como caminho". A partir daí, CTRL + V em uma janela SSMS. Também funciona com vários arquivos. Selecione dois ou mais arquivos no Explorer, clique com o botão direito em qualquer um dos arquivos destacados e selecione "Copiar como caminho". Repita as etapas no SSMS. Os caminhos dos arquivos são colocados entre aspas duplas, que você pode ou não querer remover no SSMS com Localizar / Substituir.
Dave Mason

21

Certifique-se de ter SQLCMD habilitado clicando na opção Query> SQLCMD mode no management studio.

  1. Suponha que você tenha quatro arquivos .sql ( script1.sql,script2.sql,script3.sql,script4.sql) em uma pasta c:\scripts.

  2. Crie um arquivo de script principal (Main.sql) com o seguinte:

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
    :r c:\Scripts\script4.sql

    Salve o Main.sql no próprio c: \ scripts.

  3. Crie um arquivo em lote denominado ExecuteScripts.batcom o seguinte:

    SQLCMD -E -d<YourDatabaseName> -ic:\Scripts\Main.sql
    PAUSE

    Lembre-se de substituir <YourDatabaseName>pelo banco de dados que deseja executar seus scripts. Por exemplo, se o banco de dados for "Funcionário", o comando seria o seguinte:

    SQLCMD -E -dEmployee -ic:\Scripts\Main.sql
    PAUSE
  4. Execute o arquivo em lote clicando duas vezes no mesmo.


Acabei de editar minha resposta. Além disso, é necessário certificar-se de que os arquivos de script existem no caminho especificado.
Ashish Gupta

o bom dessa abordagem é que qualquer erro é encontrado e, em seguida, pare de executar outros scripts :) semelhante ao -bexemplo:SQLCMD -b -i "file 1.sql","file 2.sql"
Jaider

e o lado ruim dessa abordagem é que é preciso manter a lista de todos os arquivos SQL a serem executados.
Francisco d'Anconia,

10

Você pode usar o ApexSQL Propagate . É uma ferramenta gratuita que executa vários scripts em vários bancos de dados. Você pode selecionar quantos scripts precisar e executá-los em um ou vários bancos de dados (até mesmo em vários servidores). Você pode criar uma lista de scripts e salvá-la e, em seguida, apenas selecionar essa lista toda vez que desejar executar os mesmos scripts na ordem criada (várias listas de scripts também podem ser adicionadas):

Selecione os scripts

Quando os scripts e bancos de dados são selecionados, eles serão mostrados na janela principal e tudo que você precisa fazer é clicar no botão “Executar” e todos os scripts serão executados nos bancos de dados selecionados na ordem dada:

Execução de scripts


8

Consulta Geral

salve as linhas abaixo no bloco de notas com o nome batch.bat e coloque dentro da pasta onde estão todos os seus arquivos de script

 for %%G in (*.sql) do sqlcmd /S servername /d databasename  -i"%%G"
    pause

EXEMPLO

para %% G em (* .sql) faça sqlcmd / S NFGDDD23432 / d EMPLYEEDB -i "%% G" pausa

em algum momento, se o login falhar para você, use o código abaixo com nome de usuário e senha

for %%G in (*.sql) do sqlcmd /S SERVERNAME /d DBNAME -U USERNAME -P PASSWORD -i"%%G"
pause

para %% G em (* .sql) faça sqlcmd / S NE8148server / d EMPLYEEDB -U Scott -P tiger -i "%% G" pausa

Depois de criar o arquivo bat dentro da pasta onde estão seus arquivos de script basta clicar no arquivo bat seus scripts serão executados


5

Escrevi um utilitário de código aberto em C # que permite arrastar e soltar muitos arquivos SQL e começar a executá-los em um banco de dados.

O utilitário possui os seguintes recursos:

  • Arraste e solte arquivos de script
  • Execute um diretório de arquivos de script
  • Sql Script envia mensagens durante a execução
  • O script foi aprovado ou reprovado nas cores verde e vermelho (amarelo para execução)
  • Parar na opção de erro
  • Abrir script na opção de erro
  • Executar relatório com o tempo gasto para cada script
  • Tempo de duração total
  • Conexão de banco de dados de teste
  • Asynchronus
  • .Net 4 e testado com SQL 2008
  • Arquivo exe único
  • Desligue a conexão a qualquer momento

4

A maneira mais fácil que encontrei inclui as seguintes etapas (o único requisito é estar no Win7 +):

  • abra a pasta no Explorer
  • selecione todos os arquivos de script
  • pressione Shift
  • clique com o botão direito na seleção e selecione "Copiar como caminho"
  • vá para SQL Server Management Studio
  • criar uma nova consulta
  • Menu de consulta, "modo SQLCMD"
  • cole a lista, então Ctrl + H, substitua '"C: \' (ou qualquer que seja a letra da unidade) por ': r" C:' (ou seja, prefixe as linhas com ': r')
  • execute a consulta

Parece longo, mas na realidade é muito rápido .. (parece longo, já que descrevi até os menores passos)



1
@echo off
cd C:\Program Files (x86)\MySQL\MySQL Workbench 6.0 CE

for %%a in (D:\abc\*.sql) do (
echo %%a
mysql --host=ip --port=3306 --user=uid--password=ped < %%a
)

Passo 1: copie as linhas acima para o bloco de notas e salve-o como bastão.

passo 2: Na pasta d drive abc em todos os arquivos Sql nas consultas executadas no servidor sql.

passo 3: Forneça seu ip, id de usuário e senha.


Esta questão está relacionada ao MSSQL, não ao MySQL.
Shawn

0

Você pode criar um único script que chama todos os outros.

Coloque o seguinte em um arquivo em lote:

@echo off
echo.>"%~dp0all.sql"
for %%i in ("%~dp0"*.sql) do echo @"%%~fi" >> "%~dp0all.sql"

Ao executar esse arquivo em lote, ele criará um novo script nomeado all.sqlno mesmo diretório em que o arquivo em lote está localizado. Ele procurará todos os arquivos com a extensão .sqlno mesmo diretório onde o arquivo em lote está localizado.

Você pode então executar todos os scripts usando sqlplus user/pwd @all.sql(ou estender o arquivo em lote para chamar sqlplusdepois de criar o all.sqlscript)


0

Para executar cada arquivo SQL no mesmo diretório, use o seguinte comando:

ls | awk '{print "@"$0}' > all.sql

Este comando criará um único arquivo SQL com os nomes de cada arquivo SQL no diretório acrescentado por "@".

Depois que o all.sqlé criado, basta executar all.sqlcom SQLPlus, ele executará todos os arquivos sql no all.sql.


0

Se você pode usar SQL interativo:

1 - Crie um arquivo .BAT com este código:

@ECHO OFF ECHO
for %%G in (*.sql) do dbisql -c "uid=dba;pwd=XXXXXXXX;ServerName=INSERT-DB-NAME-HERE" %%G
pause

2 - Altere o pwd e o ServerName.

3 - Coloque o arquivo .BAT na pasta que contém os arquivos .SQL e execute-o.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.