Jalankan semua file SQL dalam sebuah direktori

117

Saya memiliki sejumlah file .sql yang harus saya jalankan untuk menerapkan perubahan yang dibuat oleh pengembang lain pada database SQL Server 2005. File diberi nama sesuai dengan pola berikut:

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

Apakah ada cara untuk menjalankan semuanya sekaligus?

KAD
sumber

Jawaban:

143

Buat file .BAT dengan perintah berikut:

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

Jika Anda perlu memberikan nama pengguna dan kata sandi

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

Perhatikan bahwa "-E" tidak diperlukan saat pengguna / sandi diberikan

Tempatkan file .BAT ini di direktori tempat Anda ingin file .SQL dieksekusi, klik dua kali file .BAT dan Anda selesai!

Vijeth
sumber
2
ketika saya menjalankan file batch beberapa masalah otentikasi terjadi mengatakan "Login gagal. Login dari domain tidak tepercaya dan tidak dapat digunakan dengan otentikasi Windows.". Apakah ada cara untuk memberikan username dan password seperti halnya nama server dan database?
Sanjay Maharjan
11
@SanjayMaharjan gunakan -U untuk pengguna dan -P untuk kata sandi, seperti:for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P "password" -i"%%G"
Rickedb
bagaimana cara meletakkan output ke file terpisah menggunakan -o? setiap kali saya menggunakan seperti -o temp.txt, temp.txt ini ditimpa. saya ingin mendapatkan file output dengan nama file sql yang sama.
kevin
@vijeth: kerja bagus, kawan. saya berpikir untuk melakukan satu per satu sekitar 200 file sql. menghemat banyak waktu
Uthistran Selvaraj
@Vijeth terima kasih. saya hanya memodifikasi untuk diri saya sendiri: lingkungan pengembangan REM REM saja !! Jeda REM untuk %% G di (* .sql) lakukan sqlcmd / S "192.168.10.139 \ SQLEXPRESS" / d "TESTDEV_DB" -U "atiour" -P "atiour" -i "%% G" pause REM REM All Script Jalankan Berhasil REM
atik sarker
71

Gunakan UNTUK . Dari prompt perintah:

c:\>for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f"
Remus Rusanu
sumber
2
Saya harus menambahkan tanda kutip di sekitar "% f" terakhir untuk membuatnya berfungsi dengan skrip yang berisi spasi
Steve Wright
Untuk versi yang bekerja dalam file batch, lihat jawaban ini .
Ian Kemp
Saya juga harus menambahkan beberapa parameter lain (misalnya / I untuk mengaktifkan pengenal yang dikutip)
Pavel K
saya suka yang satu ini - tetapi apakah ada cara untuk mendapatkan hasil keluaran ke file? jadi saya dapat dengan mudah melihat pengecualian? saya baru saja mencoba perintah ini pada 136 file .sql, jadi saya kehilangan visibilitas sebagian besar dari mereka
Kaya
2
@Rich Untuk mengalihkan keluaran ke file, gunakan perintah ini: for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f" >> sql.log 2>&1) Anda dapat membaca lebih lanjut tentang pengalihan keluaran di sini
danijelk
26
  1. Di SQL Management Studio, buka kueri baru dan ketik semua file seperti di bawah ini

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  2. Buka menu Query di SQL Management Studio dan pastikan Mode SQLCMD diaktifkan
  3. Klik pada Mode SQLCMD; file akan dipilih dalam warna abu-abu seperti di bawah ini

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  4. Sekarang jalankan
Ramakrishna Talla
sumber
3
ini sangat membosankan jika saya memiliki ratusan file.
devlin anyelir
1
@devlincarnate: Agaknya Anda dapat menemukan cara untuk mengotomatiskan langkah 1. Seperti "dir / B * .sql> list.txt", dan kemudian pijat file list.txt itu sedikit.
Jeff Roe
@devlincarnate di versi Windows yang lebih baru, Anda dapat menahan tombol Shift, klik kanan file, dan pilih "Salin sebagai jalur". Dari sana, CTRL + V ke jendela SSMS. Ia bekerja dengan banyak file juga. Pilih dua atau lebih file di Explorer, klik kanan file mana saja yang disorot, dan pilih "Salin sebagai jalur". Ulangi langkah-langkah di SSMS. Jalur file diapit tanda kutip ganda, yang mungkin ingin Anda hapus atau tidak ingin hapus di SSMS dengan Find / Replace.
Dave Mason
21

Pastikan Anda mengaktifkan SQLCMD dengan mengklik opsi Query> SQLCMD mode di studio manajemen.

  1. Misalkan Anda memiliki empat file .sql ( script1.sql,script2.sql,script3.sql,script4.sql) dalam sebuah folder c:\scripts.

  2. Buat file skrip utama (Main.sql) dengan yang berikut:

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

    Simpan Main.sql di c: \ scripts itu sendiri.

  3. Buat file batch ExecuteScripts.batdengan nama berikut:

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

    Ingatlah untuk mengganti <YourDatabaseName>dengan database yang Anda inginkan untuk menjalankan skrip Anda. Misalnya, jika database adalah "Karyawan", perintahnya adalah sebagai berikut:

    SQLCMD -E -dEmployee -ic:\Scripts\Main.sql
    PAUSE
  4. Jalankan file batch dengan mengklik dua kali yang sama.

Ashish Gupta
sumber
Saya baru saja mengedit jawaban saya. Juga, seseorang perlu memastikan file skrip ada di jalur yang ditentukan.
Ashish Gupta
hal yang baik tentang pendekatan ini adalah bahwa setiap kesalahan ditemukan kemudian berhenti menjalankan skrip lebih lanjut :) mirip dengan -bcontoh:SQLCMD -b -i "file 1.sql","file 2.sql"
Jaider
dan hal buruk tentang pendekatan ini bahwa seseorang harus memelihara daftar semua file SQL yang akan dijalankan.
Francisco d'Anconia
10

Anda dapat menggunakan ApexSQL Propagate . Ini adalah alat gratis yang menjalankan banyak skrip pada banyak database. Anda dapat memilih skrip sebanyak yang Anda butuhkan dan menjalankannya pada satu atau beberapa database (bahkan beberapa server). Anda dapat membuat daftar skrip dan menyimpannya, lalu cukup pilih daftar itu setiap kali Anda ingin menjalankan skrip yang sama dalam urutan yang dibuat (beberapa daftar skrip juga dapat ditambahkan):

Pilih skrip

Ketika skrip dan database dipilih, mereka akan ditampilkan di jendela utama dan yang harus Anda lakukan adalah mengklik tombol "Execute" dan semua skrip akan dijalankan pada database yang dipilih dengan urutan yang diberikan:

Eksekusi skrip

Kevin L.
sumber
8

Pertanyaan Umum

simpan baris di bawah ini di notepad dengan nama batch.bat dan letakkan di dalam folder tempat semua file script Anda berada di sana

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

CONTOH

untuk %% G dalam (* .sql) lakukan sqlcmd / S NFGDDD23432 / d EMPLYEEDB -i "%% G" jeda

kadang-kadang jika login gagal untuk Anda, silakan gunakan kode di bawah ini dengan nama pengguna dan kata sandi

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

untuk %% G in (* .sql) lakukan sqlcmd / S NE8148server / d EMPLYEEDB -U Scott -P tiger -i "%% G" pause

Setelah Anda membuat file bat di dalam folder tempat file Script Anda berada di sana, cukup klik pada file bat, skrip Anda akan dieksekusi

Lijo
sumber
5

Saya menulis sebuah utilitas open source di C # yang memungkinkan Anda untuk menarik dan melepas banyak file SQL dan mulai menjalankannya pada database.

Utilitas tersebut memiliki beberapa fitur berikut:

  • Seret dan Jatuhkan file skrip
  • Jalankan direktori file skrip
  • Sql Script mengeluarkan pesan selama eksekusi
  • Lulus atau gagal skrip yang diwarnai hijau dan merah (kuning untuk berjalan)
  • Berhenti pada opsi kesalahan
  • Buka skrip pada opsi kesalahan
  • Jalankan laporan dengan waktu yang dibutuhkan untuk setiap skrip
  • Total durasi waktu
  • Uji koneksi DB
  • Asynchronus
  • .Net 4 & diuji dengan SQL 2008
  • File exe tunggal
  • Matikan koneksi kapan saja
Clinton Ward
sumber
4

Cara termudah yang saya temukan termasuk langkah-langkah berikut (satu-satunya persyaratan adalah berada di Win7 +):

  • buka folder di Explorer
  • pilih semua file script
  • tekan Shift
  • klik kanan pilihan dan pilih "Salin sebagai jalur"
  • pergi ke SQL Server Management Studio
  • buat kueri baru
  • Menu Kueri, "mode SQLCMD"
  • rekatkan daftar, lalu Ctrl + H, ganti '"C: \' (atau apa pun huruf drive) dengan ': r" C:' (yaitu awali baris dengan ': r')
  • jalankan kueri

Kedengarannya panjang, tetapi pada kenyataannya sangat cepat .. (kedengarannya lama seperti yang saya gambarkan bahkan langkah terkecil)

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

Langkah 1: baris di atas salin ke buku catatan simpan sebagai kelelawar.

langkah2: Dalam folder abc drive d di semua file Sql dalam kueri yang dijalankan di server sql.

step3: Berikan ip Anda, id pengguna dan kata sandi.

Nagaraju Chimmani
sumber
Pertanyaan ini berkaitan dengan MSSQL, bukan MySQL.
Shawn
0

Anda dapat membuat satu skrip yang memanggil semua yang lain.

Letakkan berikut ini ke dalam file batch:

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

Ketika Anda menjalankan file batch itu akan membuat skrip baru bernama all.sqldi direktori yang sama di mana file batch berada. Ini akan mencari semua file dengan ekstensi .sqldi direktori yang sama tempat file batch berada.

Anda kemudian dapat menjalankan semua skrip dengan menggunakan sqlplus user/pwd @all.sql(atau memperluas file batch untuk memanggil sqlplussetelah membuat all.sqlskrip)

rahul jain
sumber
0

Untuk menjalankan setiap SQLfile di direktori yang sama gunakan perintah berikut:

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

Perintah ini akan membuat satu file SQL dengan nama setiap file SQL dalam direktori yang ditambahkan dengan "@".

Setelah all.sqldibuat cukup jalankan all.sqldengan SQLPlus, ini akan mengeksekusi setiap file sql di file all.sql.

pengguna7609040
sumber
0

Jika Anda dapat menggunakan SQL Interaktif:

1 - Buat file .BAT dengan kode ini:

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

2 - Ubah pwd dan Nama Server.

3 - Letakkan file .BAT di folder yang berisi file .SQL dan jalankan.

Alberto Labuto
sumber