Chạy tất cả các tệp SQL trong một thư mục


117

Tôi có một số tệp .sql mà tôi phải chạy để áp dụng các thay đổi do các nhà phát triển khác thực hiện trên cơ sở dữ liệu SQL Server 2005. Các tệp được đặt tên theo mẫu sau:

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

Có cách nào để chạy tất cả chúng trong một lần không?

Câu trả lời:


143

Tạo tệp .BAT bằng lệnh sau:

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

Nếu bạn cần cung cấp tên người dùng và mật khẩu

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

Lưu ý rằng "-E" không cần thiết khi người dùng / mật khẩu được cung cấp

Đặt tệp .BAT này vào thư mục mà bạn muốn các tệp .SQL được thực thi, nhấp đúp vào tệp .BAT và bạn đã hoàn tất!


2
khi tôi thực thi tệp lô, một số vấn đề xác thực xảy ra thông báo "Đăng nhập không thành công. Đăng nhập từ một miền không đáng tin cậy và không thể được sử dụng với xác thực Windows". Có cách nào để cung cấp tên người dùng và mật khẩu giống như tên máy chủ và cơ sở dữ liệu không?
Sanjay Maharjan

11
@SanjayMaharjan sử dụng -U cho người dùng và -P cho mật khẩu, như:for %%G in (*.sql) do sqlcmd /S servername /d databaseName -U username -P "password" -i"%%G"
Rickedb

làm thế nào tôi có thể đặt đầu ra cho các tệp riêng biệt bằng -o? bất cứ khi nào tôi sử dụng như -o temp.txt, temp.txt này sẽ bị ghi đè. tôi muốn lấy các tệp đầu ra có cùng tên tệp sql.
kevin

@vijeth: bạn làm tốt lắm. tôi đã nghĩ đến việc làm từng cái một trong số 200 tệp sql. tiết kiệm rất nhiều thời gian
Uthistran Selvaraj

@Vijeth cảm ơn bạn. tôi chỉ sửa đổi cho bản thân: môi trường phát triển REM REM mà thôi !! Tạm dừng REM cho %% G trong (* .sql) do sqlcmd / S "192.168.10.139 \ SQLEXPRESS" / d "TESTDEV_DB" -U "atiour" -P "atiour" -i "%% G" tạm dừng REM REM All Script chạy thành công REM
Atik Sarker

71

Sử dụng FOR . Từ dấu nhắc lệnh:

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

2
Tôi đã có thêm dấu ngoặc kép quanh người cuối cùng "% f" để làm cho nó làm việc với các kịch bản có chứa không gian
Steve Wright

Đối với phiên bản hoạt động trong các tệp hàng loạt, hãy xem câu trả lời này .
Ian Kemp

Tôi cũng đã có thêm một số params khác (ví dụ / I để cho phép định danh trích dẫn)
Pavel K

tôi thích cái này - nhưng có cách nào để đưa kết quả ra tệp không? vì vậy tôi có thể dễ dàng nhìn thấy bất kỳ ngoại lệ? tôi vừa thử lệnh này trên 136 tệp .sql, vì vậy tôi đã mất khả năng hiển thị của hầu hết chúng
Giàu có

2
@ Rich Để chuyển hướng đầu ra cho tập tin, sử dụng lệnh này: for %f in (*.sql) do sqlcmd /S <servername> /d <dbname> /E /i "%f" >> sql.log 2>&1) Bạn có thể đọc thêm về chuyển hướng sản lượng ở đây
danijelk

26
  1. Trong SQL Management Studio, hãy mở một truy vấn mới và nhập tất cả các tệp như bên dưới

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  2. Đi tới trình đơn Truy vấn trên SQL Management Studio và đảm bảo Chế độ SQLCMD được bật
  3. Nhấp vào Chế độ SQLCMD; tệp sẽ được chọn màu xám như bên dưới

    :r c:\Scripts\script1.sql
    :r c:\Scripts\script2.sql
    :r c:\Scripts\script3.sql
  4. Bây giờ thực thi

3
điều này thực sự tẻ nhạt nếu tôi có hàng trăm tệp.
devlin carnate

1
@devlincarnate: Có lẽ bạn có thể nghĩ ra cách để tự động hóa bước 1. Chẳng hạn như "dir / B * .sql> list.txt", sau đó xoa bóp tệp list.txt đó một chút.
Jeff Roe

@devlincarnate trong các phiên bản Windows mới hơn, bạn có thể giữ phím Shift, nhấp chuột phải vào tệp và chọn "Sao chép dưới dạng đường dẫn". Từ đó, CTRL + V vào một cửa sổ SSMS. Nó cũng hoạt động với nhiều tệp. Chọn hai hoặc nhiều tệp trong Explorer, nhấp chuột phải vào bất kỳ tệp nào được đánh dấu và chọn "Sao chép dưới dạng đường dẫn". Lặp lại các bước trong SSMS. Đường dẫn tệp được đặt trong dấu ngoặc kép, bạn có thể muốn hoặc không muốn loại bỏ trong SSMS với Tìm / Thay thế.
Dave Mason

21

Đảm bảo bạn đã bật SQLCMD bằng cách nhấp vào tùy chọn Truy vấn> Chế độ SQLCMD trong studio quản lý.

  1. Giả sử bạn có bốn tệp .sql ( script1.sql,script2.sql,script3.sql,script4.sql) trong một thư mục c:\scripts.

  2. Tạo một tệp script chính (Main.sql) như sau:

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

    Lưu Main.sql trong chính c: \ scripts.

  3. Tạo một tệp hàng loạt có tên ExecuteScripts.batnhư sau:

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

    Hãy nhớ thay thế <YourDatabaseName>bằng cơ sở dữ liệu mà bạn muốn thực thi các tập lệnh của mình. Ví dụ: nếu cơ sở dữ liệu là "Nhân viên", lệnh sẽ như sau:

    SQLCMD -E -dEmployee -ic:\Scripts\Main.sql
    PAUSE
  4. Thực thi tệp hàng loạt bằng cách nhấp đúp vào cùng một.


Tôi chỉ chỉnh sửa câu trả lời của tôi. Ngoài ra, người ta cần đảm bảo rằng các tệp script tồn tại trong đường dẫn được chỉ định.
Ashish Gupta

những điều tốt về phương pháp này là bất kỳ lỗi được tìm thấy sau đó dừng thực hiện thêm các kịch bản :) tương tự như -bví dụ:SQLCMD -b -i "file 1.sql","file 2.sql"
Jaider

và điều tồi tệ của cách tiếp cận này là người ta phải duy trì danh sách tất cả các tệp SQL sẽ được chạy.
Francisco d'Anconia

10

Bạn có thể sử dụng ApexSQL Tuyên truyền . Nó là một công cụ miễn phí thực thi nhiều tập lệnh trên nhiều cơ sở dữ liệu. Bạn có thể chọn bao nhiêu tập lệnh tùy thích và thực thi chúng trên một hoặc nhiều cơ sở dữ liệu (thậm chí nhiều máy chủ). Bạn có thể tạo danh sách tập lệnh và lưu nó, sau đó chỉ cần chọn danh sách đó mỗi khi bạn muốn thực thi các tập lệnh đó theo thứ tự đã tạo (cũng có thể thêm nhiều danh sách tập lệnh):

Chọn tập lệnh

Khi các tập lệnh và cơ sở dữ liệu được chọn, chúng sẽ được hiển thị trong cửa sổ chính và tất cả những gì bạn phải làm là nhấp vào nút “Thực thi” và tất cả các tập lệnh sẽ được thực thi trên các cơ sở dữ liệu đã chọn theo thứ tự nhất định:

Thực thi tập lệnh


8

Truy vấn chung

lưu các dòng dưới đây trong notepad với tên batch.bat và đặt bên trong thư mục chứa tất cả tệp script của bạn ở đó

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

THÍ DỤ

cho %% G in (* .sql) do sqlcmd / S NFGDDD23432 / d EMPLYEEDB -i "%% G" tạm dừng

đôi khi nếu đăng nhập không thành công cho bạn, vui lòng sử dụng mã dưới đây với tên người dùngmật khẩu

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

cho %% G in (* .sql) do sqlcmd / S NE8148server / d EMPLYEEDB -U Scott -P tiger -i "%% G" tạm dừng

Sau khi bạn tạo tệp dơi bên trong thư mục chứa tệp Script của bạn, chỉ cần nhấp vào tệp dơi, các tập lệnh của bạn sẽ được thực thi


5

Tôi đã viết một tiện ích nguồn mở bằng C # cho phép bạn kéo và thả nhiều tệp SQL và bắt đầu chạy chúng trên cơ sở dữ liệu.

Tiện ích có các tính năng sau:

  • Kéo và thả tệp script
  • Chạy một thư mục các tệp script
  • Sql Script out đưa các thông báo trong quá trình thực thi
  • Tập lệnh được thông qua hoặc không thành công có màu xanh lục và đỏ (màu vàng để chạy)
  • Dừng khi tùy chọn lỗi
  • Mở script khi tùy chọn lỗi
  • Chạy báo cáo với thời gian thực hiện cho mỗi tập lệnh
  • Tổng thời lượng
  • Kiểm tra kết nối DB
  • Asynchronus
  • .Net 4 và được thử nghiệm với SQL 2008
  • Tệp exe duy nhất
  • Ngắt kết nối bất cứ lúc nào

4

Cách dễ nhất mà tôi tìm thấy bao gồm các bước sau (yêu cầu duy nhất là nó phải có trong Win7 +):

  • mở thư mục trong Explorer
  • chọn tất cả các tệp kịch bản
  • ấn phím Shift
  • nhấp chuột phải vào lựa chọn và chọn "Sao chép dưới dạng đường dẫn"
  • đi tới SQL Server Management Studio
  • tạo một truy vấn mới
  • Menu truy vấn, "chế độ SQLCMD"
  • dán danh sách, sau đó Ctrl + H, thay thế '"C: \' (hoặc bất kỳ ký tự ổ đĩa nào) bằng ': r" C:' (tức là tiền tố các dòng bằng ': r')
  • chạy truy vấn

Nghe thì có vẻ dài nhưng thực tế thì rất nhanh .. (nghe có vẻ dài như mình đã mô tả từng bước dù là nhỏ nhất)



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
)

Bước 1: các dòng trên copy vào note pad lưu nó dưới dạng bat.

step2: Trong thư mục abc ổ d trong tất cả các tệp Sql trong các truy vấn được thực thi trong máy chủ sql.

Bước 3: Cung cấp ip, id người dùng và mật khẩu của bạn.


Câu hỏi này liên quan đến MSSQL, không phải MySQL.
Shawn

0

Bạn có thể tạo một tập lệnh duy nhất gọi tất cả các tập lệnh khác.

Đặt những thứ sau vào một tệp hàng loạt:

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

Khi bạn chạy tệp lô đó, nó sẽ tạo một tập lệnh mới có tên all.sqltrong cùng thư mục nơi chứa tệp lô. Nó sẽ tìm kiếm tất cả các tệp có phần mở rộng .sqltrong cùng một thư mục chứa tệp hàng loạt.

Sau đó, bạn có thể chạy tất cả các tập lệnh bằng cách sử dụng sqlplus user/pwd @all.sql(hoặc mở rộng tệp hàng loạt để gọi sqlplussau khi tạo all.sqltập lệnh)


0

Để thực thi mọi tệp SQL trên cùng một thư mục, hãy sử dụng lệnh sau:

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

Lệnh này sẽ tạo một tệp SQL duy nhất với tên của mọi tệp SQL trong thư mục được thêm vào bằng "@".

Sau khi all.sqlđược tạo chỉ cần thực thi all.sqlvới SQLPlus, điều này sẽ thực thi mọi tệp sql trong all.sql.


0

Nếu bạn có thể sử dụng Interactive SQL:

1 - Tạo tệp .BAT với mã này:

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

2 - Thay đổi pwd và ServerName.

3 - Đặt tệp .BAT vào thư mục chứa các tệp .SQL và chạy nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.