2010-04-06 8 views
89

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 schéma suivant:Exécuter tous les fichiers SQL dans un répertoire

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

Y at-il un moyen d'exécuter tous en une seule fois? Ce que je sais que vous pouvez utiliser les commandes osql ou sqlcmd pour exécuter plusieurs fichiers sql.

Répondre

99

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

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

Placez ce fichier .BAT dans le répertoire à partir duquel vous souhaitez que les fichiers .SQL à exécuter, double cliquez sur le fichier .BAT et vous avez terminé!

+2

Lors de l'exécution du fichier batch, un problème d'authentification se produisait: "Echec de la connexion: le login provient d'un domaine non approuvé et ne peut pas être utilisé avec l'authentification Windows". Est-il possible de fournir un nom d'utilisateur et un mot de passe comme nom de serveur et base de données? –

+4

@SanjayMaharjan utilise -U pour l'utilisateur et -P pour le mot de passe, comme: 'pour %% G dans (* .sql) sqlcmd/S nom_serveur/d nom_base -U nom d'utilisateur -P" mot de passe "-i" %% G " ' – Rickedb

+0

comment puis-je mettre la sortie à séparer les fichiers en utilisant -o? chaque fois que j'utilise -o temp.txt, ce temp.txt est écrasé. Je veux obtenir les fichiers de sortie en tant que même nom de fichier sql. – kevin

17

Assurez-vous que vous avez SQLCMD activé en cliquant sur la requête > option de mode SQLCMD 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éer avec les éléments suivants d'un fichier de script principal (Main.sql):

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

    Save the Main.sql dans c: \ scripts lui-même.

  3. Créer un fichier de commandes nommé ExecuteScripts.bat ce qui suit:

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

    Souvenez-vous de remplacer <YourDatabaseName> avec 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 batch en double cliquant sur le même.

+1

'syntaxe incorrecte près de ':'. 'pour': r foo.sql' – abatishchev

+0

Je viens d'edi Ted ma réponse. En outre, il faut s'assurer que les fichiers de script existent dans le chemin spécifié. –

+0

la bonne chose à propos de cette approche est que toute erreur est trouvée puis arrêter d'exécuter d'autres scripts :) semblable à l'exemple '-b':' SQLCMD -b -i "fichier 1.sql", "fichier 2.sql" ' – Jaider

64

Utilisez FOR. À l'invite de commande:

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

J'ai dû ajouter des guillemets autour du dernier "% f" pour le faire fonctionner avec des scripts qui contiennent des espaces –

+0

Pour une version qui fonctionne dans les fichiers batch, voir [cette réponse] (http://stackoverflow.com/a/6504317/ 70345). –

+0

Je devais également ajouter d'autres paramètres (par exemple/I pour activer les identificateurs entre guillemets) –

5

J'ai écrit an open source utility 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:

  • Faites glisser les fichiers de script
  • Exécuter un répertoire de fichiers de script
  • Sql Script des messages vente lors de l'exécution
  • Script est conforme ou non qui sont couleur verte et rouge (jaune pour la course)
  • Option d'arrêt sur erreur
  • Script ouvert sur l'option d'erreur
  • Exécuter le rapport avec le temps pris pour chaque script
  • durée totale
  • Test de la connexion DB
  • Asynchronus
  • .Net 4 & testé avec SQL 2008
  • un seul fichier exe
  • connexion Tuer au à tout moment
0

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

il faut mettre dans un fichier batch:

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

Lorsque vous exécutez ce fichier batch, il va créer un nouveau script nommé all.sql dans le même répertoire que le fichier de commandes est situé. Il recherchera tous les fichiers portant l'extension .sql dans le même répertoire que le fichier batch.

Vous pouvez ensuite exécuter tous les scripts en utilisant sqlplus user/pwd @all.sql (ou étendre le fichier batch pour appeler sqlplus après avoir créé le script all.sql)

15
  1. Dans le 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. Aller au menu requête SQL Management studio et assurez-vous que le mode est activé SQLCMD
  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écuter
+0

C'est vraiment fastidieux si j'ai des centaines de fichiers. –

6

général de requêtes

enregistrer les lignes ci-dessous dans le bloc-notes avec le nom batch.bat et placez dans le dossier où tous vos fichier script sont là

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

EXA MPLE

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

quelque temps si la connexion a échoué pour vous s'il vous plaît utilisez le code ci-dessous avec le nom d'utilisateur et 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/j EMPLYEEDB -U Scott -P tigre -i « %% G » pause

Après avoir créé le fichier de chauve-souris dans le dossier dans lequel vos fichiers de script sont il suffit de cliquer sur le fichier bat vos scripts sont exécutées

0

Pour exécuter tous les SQLFile sur le même répertoire, utilisez la commande suivante:

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

Cette commande va créer un seul fichier SQL avec les noms de chaque fichier SQL dans le répertoire joint par « @ ». Une fois que le all.sql est créé, exécutez simplement all.sql avec SQLPlus, cela exécutera tous les fichiers sql du fichier all.sql.

8

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 vous le souhaitez et les exécuter sur une ou plusieurs bases de données (même plusieurs serveurs). Vous pouvez créer une liste de scripts et de l'enregistrer, puis il suffit de sélectionner cette liste chaque fois que vous voulez exécuter ces mêmes scripts dans l'ordre créé (listes de script multiples peuvent également être ajoutés):

Select scripts

Lorsque des scripts et des bases de données sont sélectionnés, ils seront affichés dans la fenêtre principale et tout ce que vous devez 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 donné:

Scripts execution

Questions connexes