Führen Sie alle SQL-Dateien in einem Verzeichnis aus

117

Ich habe eine Reihe von SQL-Dateien, die ich ausführen muss, um Änderungen anderer Entwickler auf eine SQL Server 2005-Datenbank anzuwenden. Die Dateien werden nach folgendem Muster benannt:

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

Gibt es eine Möglichkeit, alle auf einmal auszuführen?

KAD
quelle

Antworten:

143

Erstellen Sie eine .BAT-Datei mit dem folgenden Befehl:

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

Wenn Sie Benutzername und Passwort angeben müssen

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

Beachten Sie, dass das "-E" nicht benötigt wird, wenn Benutzer / Passwort angegeben werden

Platzieren Sie diese .BAT-Datei in dem Verzeichnis, aus dem die .SQL-Dateien ausgeführt werden sollen. Doppelklicken Sie auf die .BAT-Datei, und fertig!

Vijeth
quelle
2
Wenn ich die Batchdatei ausgeführt habe, tritt ein Authentifizierungsproblem auf, das besagt: "Anmeldung fehlgeschlagen. Die Anmeldung stammt aus einer nicht vertrauenswürdigen Domäne und kann nicht mit der Windows-Authentifizierung verwendet werden." Gibt es eine Möglichkeit, Benutzername und Passwort wie Servername und Datenbank anzugeben?
Sanjay Maharjan
11
@ SanjayMaharjan verwenden -U als Benutzer und -P als Passwort, wie:for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P "password" -i"%%G"
Rickedb
Wie kann ich die Ausgabe mit -o in separate Dateien verschieben? Wenn ich wie -o temp.txt verwende, wird diese temp.txt überschrieben. Ich möchte die Ausgabedateien als gleichen SQL-Dateinamen erhalten.
Kevin
@ Vijeth: Gute Arbeit Mann. Ich dachte daran, nacheinander etwa 200 SQL-Dateien zu erstellen. viel Zeit
gespart
@ Vijeth danke. Ich ändere nur für mich selbst: Nur REM REM-Entwicklungsumgebung !! REM-Pause für %% G in (* .sql) do sqlcmd / S "192.168.10.139 \ SQLEXPRESS" / d "TESTDEV_DB" -U "atiour" -P "atiour" -i "%% G" Pause REM REM All Script Führen Sie erfolgreich REM
atik sarker
71

Verwenden Sie FOR . An der Eingabeaufforderung:

c:\>for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f"
Remus Rusanu
quelle
2
Ich musste Anführungszeichen um das letzte "% f" hinzufügen, damit es mit Skripten funktioniert, die Leerzeichen enthalten
Steve Wright
Eine Version, die in Batchdateien funktioniert, finden Sie in dieser Antwort .
Ian Kemp
Ich musste auch einige andere Parameter hinzufügen (z. B. / I, um zitierte Bezeichner zu aktivieren)
Pavel K
Ich mag dieses - aber gibt es eine Möglichkeit, die Ergebnisse in eine Datei auszugeben? so kann ich leicht irgendwelche Ausnahmen sehen? Ich habe gerade diesen Befehl für 136 .sql-Dateien ausprobiert, daher habe ich die Sichtbarkeit der meisten von ihnen verloren
Rich
2
@Rich Verwenden Sie diesen Befehl, um die Ausgabe in eine Datei umzuleiten: for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f" >> sql.log 2>&1) Weitere
Informationen
26
  1. Öffnen Sie im SQL Management Studio eine neue Abfrage und geben Sie alle Dateien wie folgt ein

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
    
  2. Gehen Sie in SQL Management Studio zum Menü Abfrage und stellen Sie sicher, dass der SQLCMD-Modus aktiviert ist
  3. Klicken Sie auf SQLCMD-Modus. Dateien werden wie unten grau ausgewählt

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
    
  4. Jetzt ausführen
Ramakrishna Talla
quelle
3
Das ist wirklich langweilig, wenn ich Hunderte von Dateien habe.
Devlin Carnate
1
@devlincarnate: Vermutlich können Sie einen Weg finden, um Schritt 1 zu automatisieren, z. B. "dir / B * .sql> list.txt", und dann diese list.txt-Datei ein wenig massieren.
Jeff Roe
@devlincarnate In neueren Windows-Versionen können Sie die Umschalttaste gedrückt halten, mit der rechten Maustaste auf eine Datei klicken und "Als Pfad kopieren" auswählen. Von dort STRG + V in ein SSMS-Fenster. Es funktioniert auch mit mehreren Dateien. Wählen Sie zwei oder mehr Dateien im Explorer aus, klicken Sie mit der rechten Maustaste auf eine der markierten Dateien und wählen Sie "Als Pfad kopieren". Wiederholen Sie die Schritte in SSMS. Dateipfade sind in doppelte Anführungszeichen eingeschlossen, die Sie möglicherweise in SSMS mit Suchen / Ersetzen entfernen möchten oder nicht.
Dave Mason
21

Stellen Sie sicher, dass SQLCMD aktiviert ist, indem Sie im Management Studio auf die Option Abfrage> SQLCMD-Modus klicken.

  1. Angenommen, Sie haben vier SQL-Dateien ( script1.sql,script2.sql,script3.sql,script4.sql) in einem Ordner c:\scripts.

  2. Erstellen Sie eine Hauptskriptdatei (Main.sql) mit den folgenden Angaben:

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

    Speichern Sie die Datei Main.sql in c: \ scripts.

  3. Erstellen Sie eine Batchdatei ExecuteScripts.batmit dem Namen :

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

    Denken <YourDatabaseName>Sie daran, diese durch die Datenbank zu ersetzen, in der Sie Ihre Skripte ausführen möchten. Wenn die Datenbank beispielsweise "Mitarbeiter" lautet, lautet der Befehl wie folgt:

    SQLCMD -E -dEmployee -ic:\Scripts\Main.sql
    PAUSE
    
  4. Führen Sie die Batchdatei durch Doppelklick aus.

Ashish Gupta
quelle
Ich habe gerade meine Antwort bearbeitet. Außerdem muss sichergestellt werden, dass die Skriptdateien im angegebenen Pfad vorhanden sind.
Ashish Gupta
Das Gute an diesem Ansatz ist, dass jeder Fehler gefunden wird und dann die Ausführung weiterer Skripte beendet wird :) ähnlich dem -bBeispiel:SQLCMD -b -i "file 1.sql","file 2.sql"
Jaider
und das Schlimme an diesem Ansatz ist, dass man die Liste aller auszuführenden SQL-Dateien pflegen muss.
Francisco d'Anconia
10

Sie können ApexSQL Propagate verwenden . Es ist ein kostenloses Tool, das mehrere Skripte in mehreren Datenbanken ausführt. Sie können beliebig viele Skripte auswählen und für eine oder mehrere Datenbanken (sogar mehrere Server) ausführen. Sie können eine Skriptliste erstellen und speichern und diese Liste dann jedes Mal auswählen, wenn Sie dieselben Skripte in der erstellten Reihenfolge ausführen möchten (es können auch mehrere Skriptlisten hinzugefügt werden):

Wählen Sie Skripte aus

Wenn Skripte und Datenbanken ausgewählt sind, werden sie im Hauptfenster angezeigt. Sie müssen lediglich auf die Schaltfläche „Ausführen“ klicken und alle Skripte werden in der angegebenen Reihenfolge für ausgewählte Datenbanken ausgeführt:

Ausführung von Skripten

Kevin L.
quelle
8

Allgemeine Abfrage

Speichern Sie die folgenden Zeilen im Editor mit dem Namen batch.bat und platzieren Sie sie in dem Ordner, in dem sich alle Ihre Skriptdateien befinden

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

BEISPIEL

für %% G in (* .sql) machen Sie sqlcmd / S NFGDDD23432 / d EMPLYEEDB -i "%% G" Pause

Wenn die Anmeldung für Sie fehlgeschlagen ist, verwenden Sie bitte den folgenden Code mit Benutzername und Passwort

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

für %% G in (* .sql) mache sqlcmd / S NE8148server / d EMPLYEEDB -U Scott -P Tiger -i "%% G" Pause

Nachdem Sie die Bat-Datei in dem Ordner erstellt haben, in dem sich Ihre Skriptdateien befinden, klicken Sie einfach auf die Bat-Datei, in der Ihre Skripte ausgeführt werden

Lijo
quelle
5

Ich habe ein Open-Source-Dienstprogramm in C # geschrieben, mit dem Sie viele SQL-Dateien per Drag & Drop verschieben und für eine Datenbank ausführen können.

Das Dienstprogramm verfügt über die folgenden Funktionen:

  • Drag & Drop-Skriptdateien
  • Führen Sie ein Verzeichnis mit Skriptdateien aus
  • SQL Script Out Put Nachrichten während der Ausführung
  • Skript bestanden oder fehlgeschlagen, grün und rot gefärbt (gelb zum Ausführen)
  • Stop bei Fehleroption
  • Öffnen Sie das Skript bei Fehleroption
  • Führen Sie den Bericht mit der für jedes Skript benötigten Zeit aus
  • Gesamtdauer
  • DB-Verbindung testen
  • Asynchronus
  • .Net 4 & mit SQL 2008 getestet
  • Einzelne exe-Datei
  • Verbindung jederzeit beenden
Clinton Ward
quelle
3

Der einfachste Weg, den ich gefunden habe, umfasste die folgenden Schritte (die einzige Voraussetzung ist, dass es in Win7 + ist):

  • Öffnen Sie den Ordner im Explorer
  • Wählen Sie alle Skriptdateien aus
  • Drücke Shift
  • Klicken Sie mit der rechten Maustaste auf die Auswahl und wählen Sie "Als Pfad kopieren".
  • Wechseln Sie zu SQL Server Management Studio
  • Erstellen Sie eine neue Abfrage
  • Abfragemenü "SQLCMD-Modus"
  • Fügen Sie die Liste ein, dann Strg + H, ersetzen Sie '"C: \' (oder was auch immer der Laufwerksbuchstabe ist) durch ': r" C:' (dh stellen Sie den Zeilen ': r' voran)
  • Führen Sie die Abfrage aus

Es klingt lang, aber in Wirklichkeit ist es sehr schnell. (Es klingt lang, wie ich selbst die kleinsten Schritte beschrieben habe.)

PepiX
quelle
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
)

Schritt 1: Über den Zeilen in Notizblock kopieren, als Fledermaus speichern.

Schritt 2: In d Laufwerk abc Ordner in allen SQL-Dateien in Abfragen in SQL Server ausgeführt.

Schritt 3: Geben Sie Ihre IP-Adresse, Benutzer-ID und Ihr Passwort an.

Nagaraju Chimmani
quelle
Diese Frage bezieht sich auf MSSQL, nicht auf MySQL.
Shawn
0

Sie können ein einzelnes Skript erstellen, das alle anderen aufruft.

Fügen Sie Folgendes in eine Batch-Datei ein:

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

Wenn Sie diese Batchdatei ausführen, wird ein neues Skript mit all.sqldemselben Namen erstellt, in dem sich die Batchdatei befindet. Es wird nach allen Dateien mit der Erweiterung .sqlin demselben Verzeichnis gesucht, in dem sich die Batchdatei befindet.

Sie können dann alle Skripte ausführen, indem Sie sqlplus user/pwd @all.sql(oder die aufzurufende Batchdatei sqlplusnach dem Erstellen des all.sqlSkripts erweitern).

rahul jain
quelle
0

Verwenden Sie den folgenden Befehl, um jede SQL-Datei im selben Verzeichnis auszuführen:

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

Dieser Befehl erstellt eine einzelne SQL-Datei mit den Namen jeder SQL-Datei in dem Verzeichnis, an das "@" angehängt ist.

Nachdem das all.sqlerstellt wurde, führen Sie es einfach all.sqlmit SQLPlus aus. Dadurch wird jede SQL-Datei im ausgeführt all.sql.

user7609040
quelle
0

Wenn Sie Interactive SQL verwenden können:

1 - Erstellen Sie eine .BAT-Datei mit diesem Code:

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

2 - Ändern Sie den pwd und den Servernamen.

3 - Legen Sie die .BAT-Datei in den Ordner, der .SQL-Dateien enthält, und führen Sie sie aus.

Alberto Labuto
quelle