Esegui tutti i file SQL in una directory


117

Ho un numero di file .sql che devo eseguire per applicare le modifiche apportate da altri sviluppatori su un database SQL Server 2005. I file vengono denominati in base al seguente modello:

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

C'è un modo per eseguirli tutti in una volta?

Risposte:


143

Crea un file .BAT con il seguente comando:

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

Se è necessario fornire nome utente e password

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

Notare che "-E" non è necessario quando vengono forniti utente / password

Posiziona questo file .BAT nella directory da cui desideri eseguire i file .SQL, fai doppio clic sul file .BAT e il gioco è fatto!


2
quando ho eseguito il file batch si verifica un problema di autenticazione dicendo "Accesso non riuscito. L'accesso proviene da un dominio non attendibile e non può essere utilizzato con l'autenticazione di Windows.". C'è un modo per fornire anche nome utente e password come nome del server e database?
Sanjay Maharjan

11
@SanjayMaharjan usa -U per utente e -P per password, come:for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P "password" -i"%%G"
Rickedb

come posso mettere l'output in file separati usando -o? ogni volta che uso come -o temp.txt, questo temp.txt viene sovrascritto. voglio ottenere i file di output con lo stesso nome di file sql.
kevin

@vijeth: buon lavoro uomo. stavo pensando di fare uno per uno circa 200 file sql. risparmiato un sacco di tempo
Uthistran Selvaraj

@Vijeth grazie. modifico solo per me stesso: solo ambiente di sviluppo REM REM !! REM pausa per %% G in (* .sql) do sqlcmd / S "192.168.10.139 \ SQLEXPRESS" / d "TESTDEV_DB" -U "atiour" -P "atiour" -i "%% G" pause REM REM Tutti gli script Esegui con successo REM
atik sarker

71

Usa FOR . Dal prompt dei comandi:

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

2
Ho dovuto aggiungere virgolette intorno all'ultimo "% f" per farlo funzionare con script che contengono spazi
Steve Wright,

Per una versione che funziona in file batch, vedere questa risposta .
Ian Kemp

Ho anche dovuto aggiungere altri parametri (ad esempio / I per abilitare gli identificatori quotati)
Pavel K

mi piace questo - ma c'è un modo per avere l'output dei risultati in un file? così posso vedere facilmente eventuali eccezioni? Ho appena provato questo comando su 136 file .sql, quindi ho perso la visibilità della maggior parte di essi
Rich

2
@Rich Per reindirizzare l'output su file, usa questo comando: for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f" >> sql.log 2>&1) Puoi leggere di più sul reindirizzamento dell'output qui
danijelk

26
  1. In SQL Management Studio aprire una nuova query e digitare tutti i file come di seguito

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  2. Vai al menu Query in SQL Management Studio e assicurati che la modalità SQLCMD sia abilitata
  3. Fare clic su Modalità SQLCMD; i file verranno selezionati in grigio come di seguito

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  4. Ora esegui

3
questo è davvero noioso se ho centinaia di file.
devlin carnate

1
@devlincarnate: Presumibilmente puoi trovare un modo per automatizzare il passaggio 1. Come "dir / B * .sql> list.txt", e poi massaggiare un po 'quel file list.txt.
Jeff Roe

@devlincarnate nelle versioni più recenti di Windows, puoi tenere premuto il tasto Maiusc, fare clic con il pulsante destro del mouse su un file e selezionare "Copia come percorso". Da lì, CTRL + V in una finestra SSMS. Funziona anche con più file. Seleziona due o più file in Explorer, fai clic con il pulsante destro del mouse su uno dei file evidenziati e seleziona "Copia come percorso". Ripeti i passaggi in SSMS. I percorsi dei file sono racchiusi tra virgolette doppie, che potresti o meno voler eliminare in SSMS con Trova / Sostituisci.
Dave Mason

21

Assicurati di avere SQLCMD abilitato facendo clic sull'opzione Query> Modalità SQLCMD nello studio di gestione.

  1. Supponiamo di avere quattro file .sql ( script1.sql,script2.sql,script3.sql,script4.sql) in una cartella c:\scripts.

  2. Creare un file di script principale (Main.sql) con quanto segue:

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

    Salvare Main.sql in c: \ scripts stesso.

  3. Crea un file batch denominato ExecuteScripts.batcon quanto segue:

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

    Ricorda di sostituire <YourDatabaseName>con il database che desideri eseguire i tuoi script. Ad esempio, se il database è "Employee", il comando sarebbe il seguente:

    SQLCMD -E -dEmployee -ic:\Scripts\Main.sql
    PAUSE
  4. Eseguire il file batch facendo doppio clic sullo stesso.


Ho appena modificato la mia risposta. Inoltre, è necessario assicurarsi che i file di script esistano nel percorso specificato.
Ashish Gupta

la cosa buona di questo approccio è che viene trovato qualsiasi errore, quindi interrompi l'esecuzione di ulteriori script :) simile -ball'esempio:SQLCMD -b -i "file 1.sql","file 2.sql"
Jaider

e la cosa negativa di questo approccio è che è necessario mantenere l'elenco di tutti i file SQL da eseguire.
Francisco d'Anconia

10

Potresti usare ApexSQL Propagate . È uno strumento gratuito che esegue più script su più database. Puoi selezionare tutti gli script di cui hai bisogno ed eseguirli su uno o più database (anche più server). È possibile creare un elenco di script e salvarlo, quindi selezionare tale elenco ogni volta che si desidera eseguire gli stessi script nell'ordine creato (è possibile aggiungere anche più elenchi di script):

Seleziona gli script

Quando gli script e i database sono selezionati, verranno visualizzati nella finestra principale e tutto ciò che devi fare è fare clic sul pulsante "Esegui" e tutti gli script verranno eseguiti sui database selezionati nell'ordine dato:

Esecuzione di script


8

Query generale

salva le righe seguenti nel blocco note con il nome batch.bat e posizionale all'interno della cartella in cui sono presenti tutti i tuoi file di script

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

ESEMPIO

per %% G in (* .sql) esegui sqlcmd / S NFGDDD23432 / d EMPLYEEDB -i "%% G" pausa

a volte se il login non è riuscito per te, utilizza il codice seguente con nome utente e password

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

per %% G in (* .sql) eseguire sqlcmd / S NE8148server / d EMPLYEEDB -U Scott -P tiger -i "%% G" pausa

Dopo aver creato il file bat all'interno della cartella in cui si trovano i tuoi file Script, fai clic sul file bat che i tuoi script verranno eseguiti


5

Ho scritto un'utilità open source in C # che consente di trascinare e rilasciare molti file SQL e iniziare a eseguirli su un database.

L'utilità ha le seguenti caratteristiche:

  • Trascina e rilascia i file di script
  • Esegui una directory di file di script
  • Sql Script invia messaggi durante l'esecuzione
  • Script superato o non riuscito di colore verde e rosso (giallo per l'esecuzione)
  • Opzione Stop in caso di errore
  • Opzione Apri script in caso di errore
  • Esegui report con il tempo impiegato per ogni script
  • Tempo di durata totale
  • Verifica connessione DB
  • asincrono
  • .Net 4 e testato con SQL 2008
  • File exe singolo
  • Elimina la connessione in qualsiasi momento

4

Il modo più semplice che ho trovato includeva i seguenti passaggi (l'unico requisito è che sia in Win7 +):

  • apri la cartella in Explorer
  • seleziona tutti i file di script
  • premere MAIUSC
  • fai clic con il pulsante destro del mouse sulla selezione e seleziona "Copia come percorso"
  • vai a SQL Server Management Studio
  • crea una nuova query
  • Menu Query, "modalità SQLCMD"
  • incolla l'elenco, quindi Ctrl + H, sostituisci "C: \" (o qualunque sia la lettera dell'unità) con ": r" C: "(ovvero anteponi le righe con": r ")
  • eseguire la query

Sembra lungo, ma in realtà è molto veloce .. (sembra lungo come ho descritto anche i passaggi più piccoli)



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
)

Passaggio 1: le righe sopra vengono copiate nel blocco note e salvate come mazza.

step2: nella cartella abc dell'unità d in tutti i file SQL nelle query eseguite nel server sql.

Step3: Fornisci il tuo IP, ID utente e password.


Questa domanda è relativa a MSSQL, non a MySQL.
Shawn

0

Puoi creare un unico script che richiami tutti gli altri.

Inserisci quanto segue in un file batch:

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

Quando si esegue quel file batch, verrà creato un nuovo script denominato all.sqlnella stessa directory in cui si trova il file batch. Cercherà tutti i file con l'estensione .sqlnella stessa directory in cui si trova il file batch.

È quindi possibile eseguire tutti gli script utilizzando sqlplus user/pwd @all.sql(o estendere il file batch da chiamare sqlplusdopo aver creato lo all.sqlscript)


0

Per eseguire ogni file SQL sulla stessa directory utilizzare il seguente comando:

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

Questo comando creerà un singolo file SQL con i nomi di ogni file SQL nella directory aggiunti da "@".

Dopo che all.sqlè stato creato, esegui semplicemente all.sqlcon SQLPlus, questo eseguirà ogni file sql in all.sql.


0

Se puoi usare Interactive SQL:

1 - Crea un file .BAT con questo codice:

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

2 - Cambia pwd e ServerName.

3 - Metti il ​​file .BAT nella cartella che contiene i file .SQL ed eseguilo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.