Exécuter tous les fichiers SQL dans un répertoire

117

J'ai un certain nombre de fichiers .sql que je dois exécuter pour appliquer les modifications apportées par d'autres développeurs sur une base de données SQL Server 2005. Les fichiers sont nommés selon le modèle suivant:

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

Existe-t-il un moyen de tous les exécuter en une seule fois?

KAD
la source

Réponses:

143

Créez un fichier .BAT avec la commande suivante:

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

Si vous devez fournir un nom d'utilisateur et un mot de passe

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

Notez que le "-E" n'est pas nécessaire lorsque l'utilisateur / mot de passe est fourni

Placez ce fichier .BAT dans le répertoire à partir duquel vous voulez que les fichiers .SQL soient exécutés, double-cliquez sur le fichier .BAT et vous avez terminé!

Vijeth
la source
2
lorsque j'ai exécuté le fichier de commandes, un problème d'authentification se produit en disant «Échec de la connexion. La connexion provient d'un domaine non approuvé et ne peut pas être utilisée avec l'authentification Windows.». Existe-t-il un moyen de fournir un nom d'utilisateur et un mot de passe comme le nom du serveur et la base de données?
Sanjay Maharjan
11
@SanjayMaharjan utilise -U pour l'utilisateur et -P pour le mot de passe, comme:for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P "password" -i"%%G"
Rickedb
comment puis-je mettre la sortie dans des fichiers séparés en utilisant -o? chaque fois que j'utilise comme -o temp.txt, ce temp.txt est écrasé. je veux obtenir les fichiers de sortie sous le même nom de fichier sql.
kevin
@vijeth: bon ouvrier. je pensais faire un par un quelque 200 fichiers sql. gagné beaucoup de temps
Uthistran Selvaraj
@Vijeth merci. je viens de modifier pour moi-même: l'environnement de développement REM REM uniquement !! REM pause pour %% G dans (* .sql) do sqlcmd / S "192.168.10.139 \ SQLEXPRESS" / d "TESTDEV_DB" -U "atiour" -P "atiour" -i "%% G" pause REM REM Tous Script Exécuter avec succès REM
atik sarker
71

Utilisez FOR . À partir de l'invite de commande:

c:\>for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f"
Remus Rusanu
la source
2
J'ai dû ajouter des guillemets autour du dernier "% f" pour le faire fonctionner avec des scripts contenant des espaces
Steve Wright
Pour une version qui fonctionne dans les fichiers de commandes, consultez cette réponse .
Ian Kemp
J'ai aussi dû ajouter d'autres paramètres (par exemple / I pour activer les identificateurs cités)
Pavel K
j'aime celui-ci - mais y a-t-il un moyen d'afficher les résultats dans un fichier? pour que je puisse facilement voir les exceptions? Je viens d'essayer cette commande sur 136 fichiers .sql, donc j'ai perdu la visibilité de la plupart d'entre eux
Rich
2
@Rich Pour rediriger la sortie vers un fichier, utilisez cette commande: for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f" >> sql.log 2>&1) Vous pouvez en savoir plus sur la redirection de la sortie ici
danijelk
26
  1. Dans SQL Management Studio, ouvrez une nouvelle requête et tapez tous les fichiers comme ci-dessous

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  2. Accédez au menu Requête sur SQL Management Studio et assurez-vous que le mode SQLCMD est activé
  3. Cliquez sur Mode SQLCMD; les fichiers seront sélectionnés en gris comme ci-dessous

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  4. Maintenant, exécutez
Ramakrishna Talla
la source
3
c'est vraiment fastidieux si j'ai des centaines de fichiers.
devlin carnate
1
@devlincarnate: Vous pouvez probablement trouver un moyen d'automatiser l'étape 1. Tels que "dir / B * .sql> list.txt", puis masser un peu ce fichier list.txt.
Jeff Roe
@devlincarnate dans les versions plus récentes de Windows, vous pouvez maintenir la touche Maj enfoncée, cliquer avec le bouton droit sur un fichier et sélectionner «Copier comme chemin». À partir de là, CTRL + V dans une fenêtre SSMS. Cela fonctionne également avec plusieurs fichiers. Sélectionnez deux fichiers ou plus dans l'Explorateur, cliquez avec le bouton droit sur l'un des fichiers en surbrillance et sélectionnez "Copier comme chemin". Répétez les étapes dans SSMS. Les chemins de fichiers sont placés entre guillemets, que vous pouvez ou non supprimer dans SSMS avec Rechercher / Remplacer.
Dave Mason
21

Assurez-vous que SQLCMD est activé en cliquant sur l'option Query> SQLCMD mode dans le studio de gestion.

  1. Supposons que vous ayez quatre fichiers .sql ( script1.sql,script2.sql,script3.sql,script4.sql) dans un dossier c:\scripts.

  2. Créez un fichier de script principal (Main.sql) avec les éléments suivants:

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

    Enregistrez le Main.sql dans c: \ scripts lui-même.

  3. Créez un fichier de commandes nommé ExecuteScripts.batcomme suit:

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

    N'oubliez pas de remplacer <YourDatabaseName>par la base de données que vous souhaitez exécuter vos scripts. Par exemple, si la base de données est "Employé", la commande serait la suivante:

    SQLCMD -E -dEmployee -ic:\Scripts\Main.sql
    PAUSE
  4. Exécutez le fichier de commandes en double-cliquant dessus.

Ashish Gupta
la source
Je viens de modifier ma réponse. En outre, il faut s'assurer que les fichiers de script existent dans le chemin spécifié.
Ashish Gupta
la bonne chose à propos de cette approche est que toute erreur est trouvée puis arrêtez d'exécuter d'autres scripts :) similaire à l' -bexemple:SQLCMD -b -i "file 1.sql","file 2.sql"
Jaider
et la mauvaise chose à propos de cette approche est qu'il faut maintenir la liste de tous les fichiers SQL à exécuter.
Francisco d'Anconia
10

Vous pouvez utiliser ApexSQL Propagate . C'est un outil gratuit qui exécute plusieurs scripts sur plusieurs bases de données. Vous pouvez sélectionner autant de scripts que nécessaire et les exécuter sur une ou plusieurs bases de données (même sur plusieurs serveurs). Vous pouvez créer une liste de scripts et l'enregistrer, puis sélectionnez simplement cette liste chaque fois que vous souhaitez exécuter ces mêmes scripts dans l'ordre créé (plusieurs listes de scripts peuvent également être ajoutées):

Sélectionnez des scripts

Lorsque les scripts et les bases de données sont sélectionnés, ils seront affichés dans la fenêtre principale et tout ce que vous avez à faire est de cliquer sur le bouton «Exécuter» et tous les scripts seront exécutés sur les bases de données sélectionnées dans l'ordre indiqué:

Exécution de scripts

Kevin L
la source
8

Requête générale

enregistrez les lignes ci-dessous dans le bloc-notes avec le nom batch.bat et placez-les dans le dossier où se trouvent tous vos fichiers de script

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

EXEMPLE

pour %% G dans (* .sql) faire sqlcmd / S NFGDDD23432 / d EMPLYEEDB -i "%% G" pause

parfois, si la connexion a échoué pour vous, veuillez utiliser le code ci-dessous avec le nom d' utilisateur et le mot de passe

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

pour %% G dans (* .sql) faire sqlcmd / S NE8148server / d EMPLYEEDB -U Scott -P tiger -i "%% G" pause

Après avoir créé le fichier bat dans le dossier dans lequel se trouvent vos fichiers de script, cliquez simplement sur le fichier bat, vos scripts seront exécutés

Lijo
la source
5

J'ai écrit un utilitaire open source en C # qui vous permet de faire glisser et déposer de nombreux fichiers SQL et de commencer à les exécuter sur une base de données.

L'utilitaire présente les caractéristiques suivantes:

  • Glisser-déposer des fichiers de script
  • Exécuter un répertoire de fichiers de script
  • Sql Script sort des messages pendant l'exécution
  • Script réussi ou échoué de couleur verte et rouge (jaune pour l'exécution)
  • Option d'arrêt en cas d'erreur
  • Ouvrir le script en cas d'erreur
  • Exécuter le rapport avec le temps nécessaire pour chaque script
  • Durée totale
  • Tester la connexion à la base de données
  • Asynchrone
  • .Net 4 et testé avec SQL 2008
  • Fichier exe unique
  • Tuez la connexion à tout moment
Clinton Ward
la source
4

Le moyen le plus simple que j'ai trouvé comprenait les étapes suivantes (la seule exigence est d'être dans Win7 +):

  • ouvrez le dossier dans l'Explorateur
  • sélectionner tous les fichiers de script
  • appuyez sur Shift
  • faites un clic droit sur la sélection et sélectionnez "Copier comme chemin"
  • accéder à SQL Server Management Studio
  • créer une nouvelle requête
  • Menu Requête, "Mode SQLCMD"
  • collez la liste, puis Ctrl + H, remplacez '"C: \' (ou quelle que soit la lettre du lecteur) par ': r" C:' (c'est-à-dire préfixez les lignes avec ': r')
  • exécuter la requête

Cela semble long, mais en réalité, c'est très rapide .. (cela semble long comme je l'ai décrit même les plus petits pas)

PepiX
la source
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
)

Étape 1: les lignes ci-dessus copient dans le bloc-notes, enregistrez-le en tant que batte.

étape2: dans le dossier abc du lecteur d dans tous les fichiers SQL dans les requêtes exécutées sur le serveur SQL.

Étape 3: indiquez votre adresse IP, votre identifiant d'utilisateur et votre mot de passe.

Nagaraju Chimmani
la source
Cette question concerne MSSQL, pas MySQL.
Shawn
0

Vous pouvez créer un seul script qui appelle tous les autres.

Mettez ce qui suit dans un fichier de commandes:

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

Lorsque vous exécutez ce fichier de commandes, il crée un nouveau script nommé all.sqldans le même répertoire où se trouve le fichier de commandes. Il recherchera tous les fichiers avec l'extension .sqldans le même répertoire où se trouve le fichier de commandes.

Vous pouvez ensuite exécuter tous les scripts en utilisant sqlplus user/pwd @all.sql(ou étendre le fichier de commandes à appeler sqlplusaprès avoir créé le all.sqlscript)

rahul jain
la source
0

Pour exécuter chaque fichier SQL sur le même répertoire, utilisez la commande suivante:

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

Cette commande créera un seul fichier SQL avec les noms de chaque fichier SQL dans le répertoire ajouté par "@".

Une fois le all.sqlcréé, exécutez simplementall.sql avec SQLPlus, cela exécutera chaque fichier sql dans le all.sql.

user7609040
la source
0

Si vous pouvez utiliser Interactive SQL:

1 - Créez un fichier .BAT avec ce code:

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

2 - Modifiez le pwd et le ServerName.

3 - Placez le fichier .BAT dans le dossier contenant les fichiers .SQL et exécutez-le.

Alberto Labuto
la source