Tüm SQL dosyalarını bir dizinde çalıştırın


117

Diğer geliştiriciler tarafından SQL Server 2005 veritabanında yapılan değişiklikleri uygulamak için çalıştırmam gereken birkaç .sql dosyam var. Dosyalar aşağıdaki modele göre adlandırılır:

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

Hepsini tek seferde çalıştırmanın bir yolu var mı?

Yanıtlar:


143

Aşağıdaki komutla bir .BAT dosyası oluşturun:

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

Kullanıcı adı ve şifre sağlamanız gerekiyorsa

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

Kullanıcı / şifre sağlandığında "-E" nin gerekli olmadığını unutmayın.

Bu .BAT dosyasını, .SQL dosyalarının çalıştırılmasını istediğiniz dizine yerleştirin, .BAT dosyasına çift tıklayın ve bitirdiniz!


2
toplu iş dosyasını çalıştırdığımda, "Oturum açılamadı. Oturum, güvenilmeyen bir etki alanından ve Windows kimlik doğrulamasıyla kullanılamaz." diyen bazı kimlik doğrulama sorunları oluşuyor. Sunucu adı ve veritabanı gibi kullanıcı adı ve şifre sağlamanın da bir yolu var mı?
Sanjay Maharjan

11
@SanjayMaharjan, kullanıcı için -U ve şifre için -P kullanır, örneğin:for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P "password" -i"%%G"
Rickedb

-o kullanarak çıktıyı ayrı dosyalara nasıl koyabilirim? -o temp.txt gibi kullandığımda bu temp.txt'nin üzerine yazılıyor. çıktı dosyalarını aynı sql dosya adıyla almak istiyorum.
Kevin

@vijeth: iyi iş adamım. 200 sql dosyalarını teker teker yapmayı düşünüyordum. çok zaman kazandırdı
Uthistran Selvaraj

@Vijeth teşekkür ederim. sadece kendim için değiştiriyorum: sadece REM REM geliştirme ortamı !! %% G in (* .sql) do sqlcmd / S "192.168.10.139 \ SQLEXPRESS" / d "TESTDEV_DB" -U "atiour" -P "atiour" -i "%% G" REM REM Tüm Komut Dosyası Başarıyla Çalıştır REM
atik sarker

71

FOR kullanın . Komut isteminden:

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

2
Boşluk içeren komut dosyalarıyla çalışmasını sağlamak için son "% f" harfini tırnak içine almak zorunda kaldım
Steve Wright

Toplu iş dosyalarında çalışan bir sürüm için bu yanıta bakın .
Ian Kemp

Ayrıca başka parametreler eklemek zorunda kaldım (örneğin, alıntılanan tanımlayıcıları etkinleştirmek için / I)
Pavel K

bunu beğendim - ancak sonuçların bir dosyaya çıktısını almanın bir yolu var mı? böylece herhangi bir istisnayı kolayca görebilir miyim? Bu komutu 136 .sql dosyasında denedim, bu yüzden çoğunun görünürlüğünü kaybettim
Zengin

2
Dosyaya @Rich için yönlendirme çıktı, bu komutu kullanın: for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f" >> sql.log 2>&1) Sen çıkış yeniden yönlendirme hakkında daha fazla bilgi bulabilirsiniz burada
danijelk

26
  1. SQL Management Studio'da yeni bir sorgu açın ve tüm dosyaları aşağıdaki gibi yazın

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
    
  2. SQL Management Studio'da Sorgu menüsüne gidin ve SQLCMD Modunun etkinleştirildiğinden emin olun.
  3. SQLCMD Moduna tıklayın; dosyalar aşağıdaki gibi gri renkte seçilecektir

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
    
  4. Şimdi çalıştır

3
yüzlerce dosyam varsa bu gerçekten sıkıcı.
devlin carnate

1
@devlincarnate: Muhtemelen 1. adımı otomatikleştirmenin bir yolunu bulabilirsin. "dir / B * .sql> list.txt" gibi ve sonra o list.txt dosyasına biraz masaj yap.
Jeff Roe

Windows'un daha yeni sürümlerinde @devlincarnate, Shift tuşunu basılı tutabilir, bir dosyayı sağ tıklayıp "Yol olarak kopyala" yı seçebilirsiniz. Oradan, CTRL + V'yi bir SSMS penceresine girin. Birden fazla dosyayla da çalışır. Explorer'da iki veya daha fazla dosya seçin, vurgulanan dosyalardan herhangi birine sağ tıklayın ve "Yol olarak kopyala" seçeneğini seçin. SSMS'deki adımları tekrarlayın. Dosya yolları çift tırnak içine alınır; bunları Bul / Değiştir ile SSMS'de çıkarmak isteyebilir veya istemeyebilirsiniz.
Dave Mason

21

Yönetim stüdyosunda Sorgu> SQLCMD modu seçeneğine tıklayarak SQLCMD'yi etkinleştirdiğinizden emin olun.

  1. script1.sql,script2.sql,script3.sql,script4.sqlBir klasörde dört .sql dosyanız ( ) olduğunu varsayalım c:\scripts.

  2. Aşağıdakilerle bir ana komut dosyası (Main.sql) oluşturun:

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

    Main.sql dosyasını c: \ scripts içine kaydedin.

  3. ExecuteScripts.batAşağıdakilerle adlandırılmış bir toplu iş dosyası oluşturun :

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

    <YourDatabaseName>Komut dosyalarınızı yürütmek istediğiniz veritabanıyla değiştirmeyi unutmayın . Örneğin, veritabanı "Çalışan" ise, komut aşağıdaki gibi olacaktır:

    SQLCMD -E -dEmployee -ic:\Scripts\Main.sql
    PAUSE
    
  4. Aynı dosyayı çift tıklayarak toplu iş dosyasını yürütün.


Cevabımı az önce düzenledim. Ayrıca, komut dosyalarının belirtilen yolda var olduğundan emin olmak gerekir.
Ashish Gupta

Bu yaklaşımla ilgili iyi olan şey, herhangi bir hatanın bulunması ve ardından başka komut dosyalarını çalıştırmayı durdurun :) -börneğe benzer şekilde :SQLCMD -b -i "file 1.sql","file 2.sql"
Jaider

ve bu yaklaşımın kötü yanı, çalıştırılacak tüm SQL dosyalarının listesini tutmak zorunda olmasıdır.
Francisco d'Anconia

10

ApexSQL Propagate'i kullanabilirsiniz . Birden çok veritabanında birden çok komut dosyası çalıştıran ücretsiz bir araçtır. İhtiyaç duyduğunuz kadar komut dosyası seçebilir ve bunları bir veya birden çok veritabanında (hatta birden çok sunucuda) çalıştırabilirsiniz. Komut dosyaları listesi oluşturabilir ve kaydedebilir, ardından aynı komut dosyalarını oluşturulan sırada her çalıştırmak istediğinizde bu listeyi seçebilirsiniz (birden fazla komut listesi de eklenebilir):

Komut dosyalarını seçin

Komut dosyaları ve veritabanları seçildiğinde, ana pencerede gösterilecekler ve yapmanız gereken tek şey "Yürüt" düğmesine tıklamak ve tüm komut dosyaları seçilen veritabanlarında verilen sırayla yürütülecektir:

Komut dosyası yürütme


8

Genel sorgu

Aşağıdaki satırları batch.bat adıyla not defterine kaydedin ve tüm komut dosyanızın bulunduğu klasörün içine yerleştirin

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

MİSAL

(* .sql) için %% G için sqlcmd / S NFGDDD23432 / d EMPLYEEDB -i "%% G" duraklatma

Bazen oturum açma sizin için başarısız olursa lütfen aşağıdaki kodu kullanıcı adı ve parola ile kullanın

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

(* .sql) için %% G için sqlcmd / S NE8148server / d EMPLYEEDB -U Scott -P kaplan -i "%% G" duraklat

Komut dosyalarınızın bulunduğu klasörün içinde bat dosyasını oluşturduktan sonra, komut dosyalarınızın çalıştırılacağı bat dosyasına tıklamanız yeterlidir.


5

C # ile birçok SQL dosyasını sürükleyip bırakmanıza ve bunları bir veritabanında çalıştırmanıza olanak tanıyan açık kaynaklı bir yardımcı program yazdım .

Yardımcı program aşağıdaki özelliklere sahiptir:

  • Komut dosyalarını Sürükle ve Bırak
  • Komut dosyalarının bir dizinini çalıştırın
  • Sql Script çıkışı yürütme sırasında mesajlar koydu
  • Yeşil ve kırmızı renkli (koşmak için sarı) komut dosyası başarılı veya başarısız oldu
  • Hata durumunda dur seçeneği
  • Hata durumunda komut dosyasını aç seçeneği
  • Her komut dosyası için alınan süreyi içeren raporu çalıştırın
  • Toplam süre
  • DB bağlantısını test et
  • Asynchronus
  • .Net 4 & SQL 2008 ile test edildi
  • Tek bir exe dosyası
  • İstediğiniz zaman bağlantıyı kesin

4

Bulduğum en kolay yol aşağıdaki adımları içeriyordu (tek gereksinim Win7 + 'da olması):

  • klasörü Explorer'da aç
  • tüm komut dosyalarını seç
  • shift'e basın
  • seçimi sağ tıklayın ve "Yol olarak kopyala" yı seçin
  • SQL Server Management Studio'ya gidin
  • yeni bir sorgu oluştur
  • Sorgu Menüsü, "SQLCMD modu"
  • listeyi yapıştırın, ardından Ctrl + H, '"C: \' (veya sürücü harfi ne olursa olsun) ': r" C:' ile değiştirin (yani satırların önüne ': r' ekleyin)
  • sorguyu çalıştır

Kulağa uzun geliyor, ama gerçekte çok hızlı .. (en küçük adımları bile tarif ettiğim sürece kulağa geliyor)



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
)

Adım 1: Yukarıdaki satırlar not defterine kopyalayın, yarasa olarak kaydedin.

step2: sql sunucusunda yürütülen sorgulardaki tüm Sql dosyalarındaki d drive abc klasöründe.

step3: ip, kullanıcı adı ve şifrenizi verin.


Bu soru MySQL ile değil, MSSQL ile ilgilidir.
Shawn

0

Diğerlerini çağıran tek bir komut dosyası oluşturabilirsiniz.

Aşağıdakileri bir toplu iş dosyasına koyun:

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

Bu toplu iş dosyasını çalıştırdığınızda, toplu iş dosyasının all.sqlbulunduğu aynı dizinde adlı yeni bir komut dosyası oluşturacaktır . .sqlToplu iş dosyasının bulunduğu aynı dizinde uzantıya sahip tüm dosyaları arayacaktır .

Daha sonra tüm komut dosyalarını kullanarak sqlplus user/pwd @all.sql(veya komut dosyasını sqlplusoluşturduktan sonra çağırmak için toplu iş dosyasını genişletebilirsiniz all.sql)


0

Aynı dizindeki her SQL dosyasını çalıştırmak için aşağıdaki komutu kullanın:

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

Bu komut, "@" ile eklenen dizindeki her SQL dosyasının adlarını içeren tek bir SQL dosyası oluşturacaktır.

all.sqlOluşturulduktan sonra basitçe all.sqlSQLPlus ile çalıştırın , bu all.sql.


0

Etkileşimli SQL kullanabiliyorsanız:

1 - Bu kodla bir .BAT dosyası oluşturun:

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

2 - pwd ve SunucuAdı'nı değiştirin.

3 - .BAT dosyasını .SQL dosyalarını içeren klasöre koyun ve çalıştırın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.